Activity
Activity | launchMode | taskAffinity | allowTaskReparenting |
---|---|---|---|
A | standard | com.timesfire.backstacktest | false |
A1 | standard | com.timesfire.backstacktest | false |
A2 | standard | com.timesfire.backstacktest | false |
B | singleTop | com.timesfire.backstacktest | false |
C | singleTask | com.timesfire.backstacktest | false |
D | singleInstance | com.timesfire.backstacktest | false |
E | standard | com.sujian | false |
F | singleTop | com.sujian | false |
G | singleTask | com.sujian | false |
H | singleInstance | com.sujian | false |
测试数据
初始Activity栈 | 启动目标Activity | addFlags | 结果 |
---|---|---|---|
A | A1 、 A2 、B、C、E、F | 无 | A与目标Activity在同一个Task中 |
A | D、G、H | 无 | 会启动新的Task,A与目标Activity在不同Task中 |
A->C->A1->A2 | C | 无 | 不会开启新的Activity C,首先A1会销毁,接着C中调用onNewIntent()方法,最后A2销毁 |
A->G | C | 无 | 新启动一个C放在和A同一个Task中,G在另一个Task中 |
A | E | FLAG_ACTIVITY_NEW_TASK |
E 在一个新的Task中启动,与A所在的Task不同 |
A | A1 | FLAG_ACTIVITY_NEW_TASK 、 FLAG_ACTIVITY_MULTIPLE_TASK |
A1 在一个新的Task中启动,与A所在的Task不同。这个始终会开启一个新的Task |
A | C | FLAG_ACTIVITY_NEW_TASK 或 FLAG_ACTIVITY_NEW_TASK 、FLAG_ACTIVITY_MULTIPLE_TASK 或 FLAG_ACTIVITY_MULTIPLE_TASK |
A、C在同一个Task中,Flags标签对singleTask不起作用 |
FLAG_ACTIVITY_CLEAR_TOP
如果正在启动的 Activity 已在当前任务中运行,则会销毁当前任务顶部的所有 Activity,并通过 onNewIntent() 将此 Intent 传递给 Activity 已恢复的实例(现在位于顶部),而不是启动该 Activity 的新实例。
产生这种行为的 launchMode 属性没有值。
默认情况 launchMode 的值为 “standard” ,所以这种情况下,当目标Activity已经存在的时,使用这个标记不会调用目标Activity的 onNewIntent()方法,会将目标Activity销毁重建。
如果将FLAG_ACTIVITY_CLEAR_TOP和FLAG_ACTIVITY_SINGLE_TOP组合使用则会调用目标Activity的onNewIntent()事件,这种情况下类似于使用launchMode=“singleTask”
“singleTask”
并不会始终创建新的Task,如果taskAffinity与启动它的activity不同才会重新创建。FLAG_ACTIVITY_NEW_TASK
也需要配置taskAffinity才会生效。
使用singleTask去开启一个刚启动过的Activity,会掉用onNewIntent()方法,而使用FLAG_ACTIVITY_NEW_TASK
去启动一个刚用FLAG_ACTIVITY_NEW_TASK
启动过的Activity不会用任何操作,如果Activity位于其它的Task中会切换Task,除此之外不会有其它操作了,着重点在Task上。FLAG_ACTIVITY_FORWARD_RESULT
这个标示可以用在多个activity交互过程中,比如A
startActivityForResultB
,这个时候如果B
startActivityC
,并且传人这个标示,则在C
中setResult,A
会收到结果,同时不管C
中是否调用setResult方法,B
中的setResult都会失效