我的解读,关于intent flags、affinity和系统清空返回栈

intent flags
FLAG_ACTIVITY_NEW_TASK
设置了这个flag,新启动的activity就会被放置在一个新的任务当中,与singletask类似但不完全一样,当然这里讨论的仍然是启动其他程序中的activity,这个flag的作用通常是模拟一种launcher的行为。即列出一堆可以启动的东西,但启动的每一个activity都是运行在自己独立的任务中的。
FLAG_ACTIVITY_SINGLE_TOP和在launchmode中指定singletop是一样的
FLAG_ACTIVITY_CLEAR_TOP
使用这个flag之后如果目标activity没有指定为任何启动模式,也就是只是standard模式。而且intent中也没有加入FLAG_ACTIVITY_SINGLE_TOP这个flag,那么目标activity就会销毁并重启。反之就会调用目标的onNewIntent方法,不会创建新的实例。


从通知栏启动activity的时候会将FLAG_ACTIVITY_CLEAR_TOP、FLAG_ACTIVITY_NEW_TASK这两个flag一同使用以便将一个后台运行的任务切换到前台,并将目标activity以上其他的activity全部关闭掉。


affinity
它可以用于指定一个activity更加愿意依附于哪一个任务,在默认情况下,同一个应用程序中所有的activity都具有相同的affinity,所以这些activity都更加倾向于运行在相同的任务中。当然,我们也可以改变每个activity的affinity的值,通过在mainifest中的<activity>元素的taskAffinity属性就可以实现了。taskAffinity属性接受一个字符串参数,你可以指定成任意的值,不过字符串中至少要包含一个“.”,但不能和应用程序的包名相同,因为系统会使用包名来作为默认的affinity值。
应用场景主要有两种:
1,只在intent或在manifest中加入singletask并不一定可以让系统为目标activity单独创建一个任务,因为系统会去检验该activity的affinity,如果和当前任务的affinity相同那就依然放入当前的任务中。得使用affinity去避免。
2,把activity的allowtaskreparenting熟悉设置为true时,activity就拥有了一个转移所在任务的能力,也就是说允许其“叛逃”。举例说明:有个天气预报程序的activity是用于展示天气的,这个activity的affinity值和其他天气预报程序的activity的值相同,只有allowtaskreparenting这个属性被设置成了true。于是我们自己写的程序用intent调用这个activity时,它可以叛逃至我们程序所在的任务中。不过当此activity原来的应用-天气预报程序被切换到前台的时候它又会叛逃至原程序所在的任务中了。


避免系统清空返回栈
如果用户将一个任务切换到后台之后过了很长一段时间,那么系统就会将这个任务中处了最底层的那个activity之外的其他所有activity全部清除掉。用户回到这个任务后,只有处于最底层的那个activity会恢复。如何才能根据需求修改这个行为?需要设置manifest的<activity>元素下的几个属性。
1,alwaysRetainTaskState
如果任务中最底层的activity设置了这个属性,并且值为true那么系统就不会清空任务栈了。
2,clearTaskOnlaunch
如果将最底层的那个activity的这个属性设置为true,那么只要用户离开当前任务,系统就会立即开始清除底层activity以上的activity。和上面那个效果相反。
3,finishOnTaskLaunch
此属性和clearTaskOnlaunch类似,不过它只作用于单个activity。如果某个activity的这个属性被设置为true,那么用户一旦离开当前任务那么该activity会被立即清除。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值