Android任务栈
- 又称为Task,采用后进先出的模式,里面存放Activity实例集合,方便Android系统通过Task对活动进行管理
- 只有处于栈顶的活动实例才能与用户进行交互。
- 只有当任务栈里的所有活动实例都被销毁了,任务栈才会销毁,这时候程序一般也结束掉了
- 一个APP不一定只有一个任务栈,特殊情况下一个活动实例可以单独拥有一个任务栈。
- 一个任务栈中可以有不用APP的活动实例,一个APP的活动实例不一定在一个任务栈中
为什么有不同的启动模式
- Android系统的默认行为是我们每次启动一个Activity都会创建一个新的实例放进栈里,Activity的数据和信息状态都将会被保留,这样会造成数据冗余, 重复数据太多, 最终还可能导致内存溢出的问题(OOM)
- 应用之间活动经常来回跳转,特殊情况还需要经常跳转到其他应用的Acitivty,这时候可能需要Activity的复用。
四种启动模式
- standard(默认)模式
可以不用特别指定,不管栈中时候已经有这个Activity的实例,直接新建一个实例,并放入到栈顶!
- singleTop 模式
当且仅当该Activity实例处于栈顶的时候才不会创建新的实例对象而是复用已存在任务栈栈顶的Activity,否则依然会创建新的实例放入栈顶。这时候Activity的onNewIntent方法会被调用:
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
}
-
singleTask 模式
又称“单例模式”,当任务栈里已经有该Activity的实例的时候会将该实例移至栈顶,并且在该实例上面所有的活动实例都会被移出任务栈,这时候Activity的onNewIntent方法同样会被调用。
-
singleInstance 模式
该Activity在整个android系统内存中有且只有一个实例,而且该实例单独尊享一个Task。换句话说,A应用需要启动的MainActivity 是singleInstance模式,当A启动后,系统会为它创建一个新的任务栈,然后A单独在这个新的任务栈中,如果此时B应用也要激活MainActivity,由于栈内复用的特性,则不会重新创建,而是两个应用共享一个Activity的实例。如下图所示:
配置启动模式的方法
- xml文件资源声明:
<activity android:name=".ActivityC"
android:launchMode="singleTask" />
- Intent 指定intent.flag()配置参数:
Intent.FLAG_ACTIVITY_NEW_TASK
相当于启动模式中的“singleTask”模式,通常在Service中启动一个Activity由于Service中并没有Activity任务栈,所以必须使用该Flag来创建一个新的Task,否则就会报错!Intent.FLAG_ACTIVITY_SINGLE_TOP
相当于启动模式中的“singleTop”模式Intent.FLAG_ACTIVITY_CLEAR_TOP
相当于启动模式中的“singleTask”模式Intent.FLAG_ACTIVITY_NO_HISTORY
使用该模式来启动Activity,当该Activity启动其他Activity后,该Activity就被销毁了,不会保留在任务栈中。如A-B,B中以这种模式启动C,C再启动D,则任务栈只有ABD。Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
使用该标识位启动的Activity不添加到最近应用列表,也即我们从最近应用里面查看不到我们启动的这个activity。与属性android:excludeFromRecents="true"效果相同。