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交互过程中,比如AstartActivityForResultB,这个时候如果BstartActivityC,并且传人这个标示,则在C中setResult,A会收到结果,同时不管C中是否调用setResult方法,B中的setResult都会失效
