android Backstack和Task详解

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