1、Android系统架构图
从上到下依次分为四层:
- Android应用框架层
- Java系统框架层
- C++系统框架层
- Linux内核层
2、Service的生命周期、启动方法、与Activity通信
启动方法
- startService():开启Service,调用者退出后Service仍然存在。
- bindService():开启Service,调用者退出后Service也随即退出。
生命周期
- 只是用startService()启动服务:onCreate() -> onStartCommand() -> onDestory
- 只是用bindService()绑定服务:onCreate() -> onBind() -> onUnBind() -> onDestory
- 同时使用startService()启动服务与bindService()绑定服务:onCreate() -> onStartCommnad() -> onBind() -> onUnBind() -> onDestory
与Activity通信
可以通过bindService的方式,先在Activity里实现一个ServiceConnection接口,并将该接口传递给bindService()方法,在ServiceConnection接口的onServiceConnected()方法里执行相关操作。
3、广播BroadcastReceiver
应用场景
- 普通广播:调用
sendBroadcast()
发送,最常用的广播。 - 有序广播:调用
sendOrderedBroadcast()
,发出去的广播会被广播接受者按照顺序接收,广播接收者按照Priority属性值从大-小排序,Priority属性相同者,动态注册的广播优先,广播接收者还可以选择对广播进行截断和修改。
注册方式
- 静态注册:常驻系统,不受组件生命周期影响,即便应用退出,广播还是可以被接收,耗电、占内存。
- 动态注册:非常驻,跟随组件的生命变化,组件结束,广播结束。在组件结束前,需要先移除广播,否则容易造成内存泄漏。
发送和接收的原理
4、ContentProvider、ContentResolver与ContentObserver之间的关系
- ContentProvider:管理数据,提供数据的增删改查操作,数据源可以是数据库、文件、XML、网络等,ContentProvider为这些数据的访问提供了统一的接口,可以用来做进程间数据共享。
- ContentResolver:ContentResolver可以不同URI操作不同的ContentProvider中的数据,外部进程可以通过ContentResolver与ContentProvider进行交互。
- ContentObserver:观察ContentProvider中的数据变化,并将变化通知给外界。
5、Android的事件分发机制
Android事件分发机制的本质:事件从哪个对象发出,经过哪些对象,最终由哪个对象处理了该事件。此处对象指的是Activity、Window与View。
Android事件的分发顺序:Activity(Window) -> ViewGroup -> View
Android事件的分发主要由三个方法来完成,如下所示:
// 父View调用dispatchTouchEvent()开始分发事件
public boolean dispatchTouchEvent(MotionEvent event){
boolean consume = false;
// 父View决定是否拦截事件
if(onInterceptTouchEvent(event)){
// 父View调用onTouchEvent(event)消费事件,如果该方法返回true,表示
// 该View消费了该事件,后续该事件序列的事件(Down、Move、Up)将不会在传递
// 该其他View。
consume = onTouchEvent(event);
}else{
// 调用子View的dispatchTouchEvent(event)方法继续分发事件
consume = child.dispatchTouchEvent(event);
}
return consume;
}
Android事件处理优先级 OnTouchListener > onTouchEvent > onClickListener
首先,取出 mListenerInfo 属性保存的监听信息,检查它的 mOnTouchListener
变量不为空、并且当前 View 是否处于启用状态(Flag == ENABLED),并且 mOnTouchListener
的 onTouch 方法返回了 true ,说明当前 View 的 onTouch 处理了事件,事件到此为止,分发结束。
onTouch
优先调用的作用是在向 View 发送触摸事件时调用。这让 mOnTouchListener
有机会在交给目标视图处理之前做出响应。
如果 onTouch 方法返回了 false ,没有消耗事件,那么将调用当前 View 的 onTouchEvent 方法来处理事件。
onTouchEvent(MotionEvent)
是 View 用来开始处理触摸运动事件的方法,如果使用此方法检测单击行为,建议通过实现并调用performClick()
来执行这些操作。这样能够保证一些系统行为的一致性,包括:
- 调用 onClickListener
- 无障碍处理 ACTION_CLICK 事件
- 触发系统点击音效
View 的 onTouchEvent 方法中处理了单击、长按、UI 的按压状态等逻辑,内部通过调用 performClickInternal()
来触发点击事件。
private boolean performClickInternal() {
// Must notify autofill manager before performing the click actions to avoid scenarios where
// the app has a click listener that changes the state of views the autofill service might
// be interested on.
notifyAutofillManagerOnClick();
return performClick();
}
针对正在处理事件的View而言,如果后续事件不再由其处理,即其失去了事件处理焦点,则会向该View分发ACTION_CANCEL事件用于标记事件结束。
www.kancloud.cn/aslai/inter…