Activity的Flags有很很多,这里分析一下比较常用的标记位.
这个标记位的作用是为Activity指定"singletask"启动模式,它的效果和在XMl中指定该启动模式相同
android:name=".Activity_A"
android:excludeFromRecents="true"/>
<activity
android:name=".Activity_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属性值相同。
android:name=".Activity_A"/>
<activity
android:name=".Activity_B"
android:launchMode="singleTask"
android:taskAffinity="com.example.Activity_B"/>
在此我们让A处于默认的任务栈中不做修改,让B处于名称为”com.example.Activity_B”的任务栈中,并规定B的启动模式为singleTask。
当我们启动App,并依次打开Activity A和B。这时我们打开多任务管理器就会看到同一个App的两个任务。
当我们在Activity A中加入android:excludeFromRecents=“true”时,就只会看到多任务管理器中只存在B并不会看到A。