Android Flags:FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS学习

Android 中存在许多的Flags(标记位),其作用也各不相同,今天就来着重对其中非常有意思的一条进行学习及解析。

首先这条Flag的内容为FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS,其对应在AndroidManifest中的属性为android:excludeFromRecents=“true”。

从该Flag的字面意思是将Activity从Recents中排除。那么这个Recents指的是什么意思呢?根据官网的解释是一个刚刚已经加载过的Activity的列表,粗略的也可以理解为Android 手机上多任务管理键被按下去后的效果。

假设现在App中存在两个Activity A和B,而我们只在AndroidManifest中添加如下代码:

<activity
    android:name=".Activity_A"
    android:excludeFromRecents="true"/>
<activity
    android:name=".Activity_B"/>
 
 
  • 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属性值相同。

<activity
    android:name=".Activity_A"/>
<activity
    android:name=".Activity_B"
    android:launchMode="singleTask"
    android:taskAffinity="com.example.Activity_B"/>
 
 
  • 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。


http://m.blog.csdn.net/ybscypress/article/details/74537394

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值