前置
-
查看当前任务栈
adb shell dumpsys activity activities | sed -En -e ‘/Running activities/,/Run #0/p’
1. 四种启动模式
-
standard
标准模式
-
singleTop
栈顶复用, 当启动的Activity位于栈顶的时候, 直接复用, 调用
onNewIntent
方法 -
singleTask
A–>B–>C–>B (B是singleTask)
-
第一次启动B之后的任务栈(B是否在新任务中启动)
B和A在同一个任务栈中
-
加入taskAffinity之后启动B的效果
B在独立的任务栈中
-
C中再去启动B
C被销毁, B的onNewIntent被调用, onCreate不会调用
官方文档中解释为Activity不存在时会创建新的任务并启动该Activity, 但是如果没有设置亲和性标记并不会创建新的任务
-
-
singleInstance
singleInstance
模式启动的Activity位于一个独立的任务栈中, 该任务栈只有这一个活动
2. Intent标记
所有的结果自己通过代码测试得到, 不确保结果一定正确
-
FLAG_ACTIVITY_NEW_TASK
A–>B–>C–>B (启动B的时候设置
FLAG_ACTIVITY_NEW_TASK
flag)-
没有设置taskAffinity
B和A同一个栈中, 第二次启动的B没有复用, 栈中依次为 [A, B, C, B]
-
给B设置taskAffinity
B在新的任务栈中启动, 第二次启动B的时候, B上面的C没有清除, B的
onNewIntent
也没被调用 -
第二次启动B的时候加入
FLAG_ACTIVITY_CLEAR_TOP
标记第二次启动B的时候会将C和B都清除, 然后重新启动B, 调用其
onCreate
方法 -
第二次启动B的时候加入
FLAG_ACTIVITY_CLEAR_TOP
标记, 并设置launchMode
为singleTop
B调用了
onNewIntent
而没有调用onCreate
重新创建
总结:
FLAG_ACTIVITY_NEW_TASK
当设置了taskAffinity属性后, 会在新的任务栈中启动Activity,当这样的Activity已经存在的时候, 会将对应的任务栈带到前台。和
FLAG_ACTIVITY_CLEAR_TOP
标记结合时会清除其上面的Activity(包括其自身), 并重现创建该Activity。 -
-
FLAG_ACTIVITY_SINGLE_TOP
效果同
singleTop
启动模式 -
FLAG_ACTIVITY_CLEAR_TOP
A–>B–>C–>B (第二次启动B的时候设置
FLAG_ACTIVITY_CLEAR_TOP
)-
第二次启动B的时候调用了B的
onCreate
, 没有调用onNewIntent
方法 -
给B设置
singleTop
启动模式第二次启动时, B没有重新创建, 调用了
onNewIntent
方法
FLAG_ACTIVITY_CLEAR_TOP calls onCreate() instead of onResume()
总结: clear_top可以清除已经在任务栈中的Activity之上的所有活动(包括自身), 如果想对当前Activity进行复用, 需要设置启动模式为
singleTop
才能进行复用 -