Android 中存在许多的Flags(标记位),其作用也各不相同,今天就来着重对其中非常有意思的一条进行学习及解析。
首先这条Flag的内容为FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS,其对应在AndroidManifest中的属性为android:excludeFromRecents=“true”。
从该Flag的字面意思是将Activity从Recents中排除。那么这个Recents指的是什么意思呢?根据官网的解释是一个刚刚已经加载过的Activity的列表,粗略的也可以理解为Android 手机上多任务管理键被按下去后的效果。
假设现在App中存在两个Activity A和B,而我们只在AndroidManifest中添加如下代码:
- 1
- 2
- 3
- 4
- 5
编译运行之后测试发现即使我们从B中进入主界面再查看多任务管理器列表仍然无法看到。那么为什么会出现这种情况呢?
通过查阅Android 源码发现,一个Application 中所有的Activity默认会使用同一个taskAffinity属性值,也可以理解为拥有相同的taskAffinity属性值的Activity会处在同一个任务栈中。所以在这种情况下,我们提到的A和B都是处在相同的任务栈中的。而当A中设置了android:excludeFromRecents=”true”之后,系统会将A所处的任务栈从多任务管理器中移除,因此即便我们设置B为加载的入口不进入A依然无法从多任务管理器中出现。
那么我们如何在同一个App中设置多个任务栈呢?
答案是通过借助TaskAffinity这个参数,一般情况下所有的Activity都会默认使用相同的taskAffinity参数。我们可以通过在AndroidManifest中规定Activity的taskAffinity属性,并配合singleTask的启动模式来达到我们想要的多任务栈效果。任务栈名称和taskAffinity属性值相同。
- 1
- 2
- 3
- 4
- 5
- 6
在此我们让A处于默认的任务栈中不做修改,让B处于名称为”com.example.Activity_B”的任务栈中,并规定B的启动模式为singleTask。
当我们启动App,并依次打开Activity A和B。这时我们打开多任务管理器就会看到同一个App的两个任务。
当我们在Activity A中加入android:excludeFromRecents=“true”时,就只会看到多任务管理器中只存在B并不会看到A。