启动模式
singleTask
singleInstance
singleTop
standard
生命周期
onCreate
onStart 可见不可交互
onResume 可见可交互
onPause 持久化操作
onStop
onRestart
onDestory
onSaveInstanceState 执行时机,系统行为杀死APP的时候会调用,给APP一个保存状态的时机,用户主动杀死时候不会调用。
对比:
onSaveInstanceState 只适合用于保存一些临时性的状态,而onPause()适合用于数据的持久化保存。
onSaveInstanceState
Binder机制
解决什么问题,两个进程之间交互数据。
两个进程都是建立Android底层Linux操作系统上的虚拟机进程。
两个进程间交互,可以用到的方案有:
- 共享内存 用到内存映射,用户态到内核态的转换。
- 管道 读写同一个文件。
- 套接字,基于TCP/IP协议,socket即是一种特殊的文件,可以控制读写
Binder机制
- 基于共享内存的,这个内存在内核中,需要通过内存映射mmap来读写。
- 基于Binder驱动建立了Client Server模式的架构,提供ServiceManager来服务进程,提供服务的进程向ServiceManager注册服务,需要读数据的进程向ServiceManager访问服务。
Service生命周期
非绑定:
onCreate 只一次
onStartCommand
onDestory
绑定:
onCreate
onBind
onUnBind
onDestory
startService
stopService
bindService
unBindService
事件分发
dispatchTouchEvent
onInterceptTouchEvent
onTouchEvent
onTouch
// ViewGroup的dispatchTouchEvent
public boolean dispatchTouchEvent(MotionEvent ev) {
if (!onInterceptTouchEvent(ev)) {
return child.dispatchTouchEvent(ev); //不拦截,则传给子View进行分发处理
} else {
return onTouchEvent(ev); //拦截事件,交由自身对象的onTouchEvent方法处理
}
}
// View的dispatchTouchEvent
// View中该方法的核心部分伪代码
public boolean dispatchTouchEvent(MotionEvent ev) {
//如果该对象的监听成员变量不为空,则会调用其onTouch方法,
if (mOnTouchListener != null && mOnTouchListener.onTouch(this, event)) {
return true; //若onTouch方法返回TRUE,则表示消费了该事件,则dispachtouTouchEvent返回TRUE,让其调用者知道该事件已被消费。
}
return onTouchEvent(ev); //若监听成员为空或onTouch没有消费该事件,则调用对象自身的onTouchEvent方法处理。
}
理解Activity,View,Window三者关系
- 三者有啥管理关系?
- 在UI显示上有啥关联?
- 初始化上,销毁上有啥关系?
- 消息传递上有啥关系?
- 架构层面有啥关系?
原理:
- Activity管理View和Window,WindowManager管理View在Window上的显示。Activity包含了一个PhoneWindow, 而PhoneWindow就是继承于Window的,Activity通过setContentView将View 设置 PhoneWindow上,而View通过WindowManager 的addView()、removeView()、updateViewLayout()对View进行管理。
- view最终显示在Window上
- Window的添加过程以及Activity的启动流程都是一次IPC的过程。Activity的启动需要通过AMS完成;Window的添加过程需要通过WindowSession完成。
View测量绘制
测量模式:
UNSPECIFIED
EXACTLY
AT_MOST
场景:
- 对于普通的 View,它的 MeasureSpec 由父视图的 MeasureSpec 和其本身的 LayoutParams 共同决定。
- 当父视图的MeasureSpec是AT_MOST,本身LayoutParams是Wrap_Content还是Mach_parent,都是AT_MOST。
- 当父视图的MeasureSpec是EXACTLY,本身LayoutParams是Wrap_Content,就是AT_MOST,本身LayoutParams是Mach_parent,就是EXACTLY
测量流程
ViewGrop测量流程
- 遍历MeasureChild
过程:getChildMeasureSpec
它用于将父布局传递来的MeasureSpec和其子view的LayoutParams,整合为一个最有可能的子View的MeasureSpec
调用:child.measure(childWidthMeasureSpec, childHeightMeasureSpec) - measure自身
onMeasure(根据所有子view的宽高计算自己的宽高,例如ListView,AT_MOST模式计算高度就是统计所有子View高累加和) - setMeasuredDimension