intent几种常见的flags:
1.FLAG_ACTIVITY_NEW_TASK
A应用a ->b应用b
首先A应用a默认taskAffinity 是A的包的名称B同理
当Intent对象包含这个标记时,系统会寻找或创建一个新的task来放置目标Activity,寻找时依据目标Activity的taskAffinity属性进行匹配,如果找到一个task的taskAffinity与之相同,就将目标Activity压入此task中,如果查找无果,则创建一个新的task,并将该task的taskAffinity设置为目标Activity的taskActivity,将目标Activity放置于此task
当a-启动b时候我们先寻找有没有和b一样的taskAffinity如果有直接将b压入,没有则去新建一个task名称为taskAffinity所定义的。如果没定义则默认我B应用的包名称
当没有设置这个时候a-b-home-a-b顺序是
home回到a时候显示的是b home回到b是由依旧显示b当设置这个flag时候
home回到a时候显示a home回到b时候显示b
2.FLAG_ACTIVITY_CLEAR_TOP
文字概述
当Intent对象包含这个标记时,如果在栈中发现存在Activity实例,则清空这个实例之上的Activity,使其处于栈顶。例如:我们的FirstActivity跳转到SecondActivity,SecondActivity跳转到ThirdActivity,而ThirdActivity又跳到SecondActivity,那么ThirdActivity实例将被弹出栈,使SecondActivity处于栈顶,显示到幕前,栈内只剩下FirstActivity和SecondActivity。这个SecondActivity既可以在onNewIntent()中接收到传来的Intent,也可以把自己销毁之后重新启动来接受这个Intent。在使用默认的“standard”启动模式下,如果没有在Intent使用到FLAG_ACTIVITY_SINGLE_TOP标记,那么它将关闭后重建,如果使用了这个FLAG_ACTIVITY_SINGLE_TOP标记,则会使用已存在的实例;对于其他启动模式,无需再使用FLAG_ACTIVITY_SINGLE_TOP,它都将使用已存在的实例,Intent会被传递到这个实例的onNewIntent()中。
A应用 a-b-c
如果c启动b 设置这个flag
则会清除b之上的这是肯定的 但是b走onNewIntent()还是走销毁重建 决定b启动模式是否用standard
情况一
在使用默认的“standard”启动模式下,
如果没有在Intent使用到FLAG_ACTIVITY_SINGLE_TOP标记,那么它将关闭后重建
情况二
在使用默认的“standard”启动模式下,
如果使用了这个FLAG_ACTIVITY_SINGLE_TOP标记,则会使用已存在的实例走onNewIntent()
请款三
如果我们不想添加FLAG_ACTIVITY_SINGLE_TOP,
那么把SecondActivity的启动模式改为“standard”之外的三种即可,效果和上面一样,都不会创建新的实例。
3.FLAG_ACTIVITY_SINGLE_TOP:
当task中存在目标Activity实例并且位于栈的顶端时,不再创建一个新的,直接利用这个实例。我们在上边的例子中也有讲到
目前发现与Activity启动模式中的singleTop效果相同。
附属:的task相关属性
taskAffinity
launchMode
allowTaskReparenting
alwaysRetainTaskState
clearTaskOnLaunch
finishOnTaskLaunch
allowTaskReparenting 默认为false
情况一 A应用a 跳到 B应用b 设置为true
如果B应用b设置
<activity android:name=".SecondActivity" android:allowTaskReparenting="true">
...
</activity>
从a跳到b
-
首先他们taskid相同
-
如果home返回 点击a 此时依旧显示a taskid不变
-
如果home返回 点击b 此时依旧是b taskid 不变
-
如果b点击返回立马出现a 证明taskid相同
情况二 A应用a 跳到 B应用b 设置为false
则b应用会处于b,taskid中 情况呢true相同但是taskid不同