Activity生命周期与启动模式
生命周期
- 一个Activity必须onPause后,新Activity才能被启动。
- Activity的启动流程可以简单的理解为请求由Instrumentation处理,然后它通过binder想AMS发送请求,AMS内部维护着一个ActivityStack并负责Activity的状态同步,AMS通过ActivityThread去同步Activity的状态从而完成生命周期方法的调用。
- 意外情况下会回调onSaveInstanceState 和 onRestoreInstanceState.调用时机分别在OnStop之前和OnStart之后
- 关于恢复数据,系统首先调用Activity的OnSavaInstanceState ,然后Activity会委托Window去保存数据,Window又会委托它的顶层View DecorView去调用OnSavaInstanceState,就这样完成了从上自下的保存数据,这是一种典型的委托思想。view的绘制过程,事件分发等都采用了委托思想。
启动模式
launchMode
- standard 标准模式,每次启动都会创建新的实例
- singleTop 栈顶复用模式,新的Activity如果位于栈顶,则不会重新创建,会回调onNewIntent方法
- singleTask 栈内复用模式,只要这个Activity存在就不会多次创建,自带clearTop效果。
- singleInstance 单实例模式,只能一个人独自在一个栈中。
TaskAffinity 任务相关性,默认情况下就是包名,可以给每个Activity都指定TaskAffinity,主要和singleTask 启动模式和allowTaskReparenting属性配合使用。
Flags
- FLAG_ACTIVITY_NEW_TASK singleTask相同作用
- FLAG_ACTIVITY_SINGLE_TOP singleTop 相同作用
- FLAG_ACTIVITY_CLEAR_TOP clearTop效果
- FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS 具有这个标记的Activity不会出现在历史列表中,当我们不希望用户通过历史列表回到我们的Acitivity时这个标记有用。等同于android:excludeFromRecents="true"。
IntentFilter的匹配规则
action的匹配规则
Intent中的action和IntentFilter中的action必须能匹配上只是一个。
category的匹配规则
可以没有,有就必须每一个都和IntentFilter中的category匹配
data的匹配规则
必须要包含IntentFilter中的所有的data.分为mimeType 和 URI .