Activity的生命周期和启动模式
Activity的生命周期
1.生命周期对应关系
onCreate-onDestroy:创建-销毁
onStart-onStop:可见-不可见
onResume-onPause:可交互-不可交互
2.如果Activity设置了透明主题,则不会调用onStop
3.Activity启动过程简介:
启动Activity的请求会由Instrumentation处理,然后它通过Binder向AMS发送请求,AMS内部维护着一个ActivityStack并负责栈内的Activity的状态同步,AMS通过ActivityThread去同步Activity的状态从而完成生命周期方法的调用。
4.在新Activity启动之前,栈顶的Activity需要先onPause后,新Activity才会启动。
5.onPause和onStop都不能执行耗时的操作,尤其是onPause,也就是说,我们应当尽量在onStop中做操作,从而使得新Activity尽快显示出来并且切换到前台。
6.异常情况下的生命周期分析:
1.资源现相关的系统配置发生变化导致Activity被杀死并重新创建
- 默认情况下,系统配置发生改变后会导致Activity销毁并重新创建,需要对数据进行保存
- 保存数据的两种方式:
1.onSaveInstanceState()——onRestoreInstanceState()|onCreate() 1.1 onSaveInstanceState() (1)来保存当前Activity的状态,这个方法的调用时机是在onStop之前,它和onPause没有既定的时序关系。 (2)这个方法只会出现在Activity被异常终止的情况下,正常情况下系统不会回调这个方法。 (3) 系统只有在Activity即将被销毁并且有机会重新显示的请下才会调用。 1.2 onRestoreInstanceState(Bundle bundle) (1) 和onCreate都可以来判断Activity是否重建 (2) 调用时机在onStart之后。 (3) 一旦被调用,其参数Bundle一定是有值的,不需要额外进行判空。 (4) 使用onCreate进行数据恢复时,其参数Bundle有可能为空,此时必须进行判空操作。 2.声明Activity的configChanges属性 android:configChanges="orientation|screenSize|keyboardHidden"
2.资源内存不足导致低优先级的Activity被杀死
- 按照优先级从高到低,分为三种:
1.前台Activity 2.可见但非前台Activity 3.后台Activity
Activity的启动模式
1.任务栈是一种“后进先出”的栈结构
2.四种启动模式:
1.standard:标准模式
2.singleTop:栈顶复用模式
3.singleTask:栈内复用模式
4.singleInstance:单实例模式
3.标准模式:standard
- 1.谁启动了这个Activity,那么这个Activity就会运行在启动它的那个Activity所在的栈中。
- 2.ApplicationContext启动标准模式的Activity会出现的问题
Calling startActivity from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag.Is this really what you want?
4.栈顶复用模式:singleTop
- 1.如果新Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建,同时它的onNewIntent方法会被调用。
5.栈内复用模式:singleTask
- 1.只要Activity在一个栈中存在,那么多次启动此Activity都不会重新创建实例,并会回调onNewIntent方法。
- 2.singleTask默认具有clearTop效果,会导致栈内所有在该Activity上面的Activity全部出栈。
- 3.当一个具有singleTask模式的Activity请求启动后,系统首先会寻找是否存在该Activity
想要的任务栈
,如果不存在,就重新创建一个任务栈,然后创建Activity的实例后把Activity放到栈中。如果存在所需要的任务栈,这是要看Activity是否在栈中有实例存在,如果有实例存在,那么系统就会把Activity调到栈顶并调用它的onNewIntent方法,如果实例不存在,就创建实例并压入栈中。(需要仔细理解)
6.单实例模式:singleInstance
- 1.这是一种加强的singleTask模式,具有singleTask模式的所有特性。
- 2.具有此模式的Activity只能
单独位于一个任务栈
中。
7.TaskAffinity:任务相关性
- 这个参数标识了一个Activity所需要的任务栈的名字,默认情况下,所有Activity所需要的任务栈的名字为应用的包名。
- TaskAffinity属性主要和singleTask启动模式或者allowTaskReparenting属性配合使用。
当TaskAffinity和allowTaskReparenting结合使用的时候,会产生特殊的效果。当一个应用A启动了应用B的某个Activity后,如果这个Activity的allowTaskReparenting设置为true的话,那么当应用B被启动后,此Activity会直接从应用A的任务栈转移到应用B的任务栈中。
8.常用的adb命令
1.查看运行的activity:adb shell dumpsys activity
9.Activity的Flags
1.FLAG_ACTIVITY_NEW_TASK:singleTask的启动模式
2.FLAG_ACTIVITY_SINGLE_TOP:singleTop的启动模式
3.FLAG_ACTIVITY_CLEAR_TOP:清除栈顶
4.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
具有此标记的Activity不会出现在历史Activity列表中。等同于在xml中指定属性android:excludeFromRecents="true"