Android之LaunchMode(启动模式)
文章目录
Activity的4种启动模式
注意: Activity的启动模式将会影响到手机系统的任务栈, 所以想深刻的理解启动模式,一定要先了解怎么去看任务栈,其实很简单输入一条命令即可
adb shell dumpsys activity activities|grep -E 'Stack|TaskRecord|Hist'
任务栈
任务栈首先是个栈,是一种先进后出的结构,一般显示在我们眼前的Activity就在栈顶,当我们按了back键之后,栈顶活动出站并销毁,这时屏幕会显示现在栈顶所显示的活动, 如果栈为空,这个任务栈将会被系统收回.
1.1 standard ------ 标准模式
这个是Activity的默认启动模式
标准模式就是在一个任务栈里,创建就入栈,销毁就出栈。将被启动的Activity加入到启动它的Activity所属的任务栈中。
==注:==如果用非Activity的Context(比如ApplicationContext)启动Activity,会报错,原因是该Context不存在任务栈。
1.2 singleTop
顾名思义:栈顶复用启动模式
当栈顶的Activity与即将要启动的Activity是同一个时,直接使用栈顶的Activity,因为当前栈顶的Activity正在显示在用户眼前,所以不会重新调用onCreate,onStart方法,但是会回调onPause和onResume方法(先执行onPause方法)。
在复用栈顶的Activity后,会回调该Activity的onNewIntent(Intent)方法。
方法名 | 执行时机 | 参数 |
---|---|---|
onNewIntent(Intent) | 在复用Activity后执行,执行时机按在onPause和onResume之间 | 该参数Intent代表启动该Activity的Intent |
注: 该launcherModel仅仅是栈顶复用,如果重复启动的Activity在栈内,是不会复用的。
1.3 singleTask
栈内复用模式
这个比singleTop模式复杂一些
LunchMode是singleTask的Activity默认具有clearTop效果,会把栈内复用的Activity之上的Activity全部出栈
该LunchMode和SingleTop一样,栈内复用后,会回调onNewIntent(Intent intent)方法,只是该方法的调用时机略有不同
情况 | 回调时机 |
---|---|
复用的Activity在栈顶 | 和singleTop一样,会执行该Activity的onPause,onResume方法。onNewIntent的回调时机在这两个方法之间 |
复用的Activity在栈内 | 会使该Activity栈内之上的Activity出栈,回调该Activity的onStart和onResume方法。onNewIntent的回调时机在这两个方法之间 |
1.3.1 什么是Activity想要的任务栈
通过命令
adb shell dumpsys activity activities
可以看到任务栈有一个名字
这个名字就是项目的包名。
默认情况下每个Activity想要的任务栈就是任务栈名为它所属项目的包名的任务栈
Activity想要的任务栈可由字段taskAffinity在AndroidMainifest.xml中设定。
taskAffinity属性的设置格式:不能与项目包名一致,并且必须有包名分隔符 .
taskAffinity属性除了可以和singleTask配合使用之外还可以与allowTaskReparenting配合使用实现Activity两个任务栈内的迁移,这里就不细讲了,感兴趣的可以百度
1.4 singleInstance
单实例模式,可以理解为singleTask的加强版,但即将要启动的Activity的LauncherModel是singleInstance时,会重新给为它创建一个任务栈,将它入栈,后续将一直可以复用此Activity,直到栈被销毁。
LauncherModel的设定方式
2.1 通过Flag动态设定
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
常见的Flags有
Flags | 作用 |
---|---|
FLAG_ACTIVITY_NEW_TASK | 设置此Flag不等价将LaunchModel设定为singleTask,仅仅表示将此Activity加入到TaskAffnity指定的任务栈中 |
FLAG_ACTIVITY_SINGLE_TOP | 将Activity的LaunchModel设定为singleTop |
FLAG_ACTIVITY_CLEAR_TOP | 将栈中Activity之上的其他Activity全部出栈,singleTask默认具有该属性 |
FLAG_ACTIVITY_EXCLUDE_FROM_TASK | 该Activity的不会出现在后台任务的列表中,和在Androidmainfest.xml中设定android:excludeFromRecents="true"同一个意思 |
2.2 在AndroidMainfest文件中设定
android:launchMode="singleTask"
2.3 优劣比较
- Flags方式的优先级比在清单文件中的优先级高,两种方式同时设置时Flags的方式会生效
- Flags方式不能设置singleInstance
- 在AndroidMainfest文件中不能设定FLAG_ACTIVITY_CLEAR_TOP