前置
-
查看当前任务栈
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_TASKflag)-
没有设置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为singleTopB调用了
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才能进行复用 -


















![[02/27][官改] Simplicity@MIX2 ROM更新-一一网](https://www.proyy.com/wp-content/uploads/2020/02/3168457341.jpg)


![[桜井宁宁]COS和泉纱雾超可爱写真福利集-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/4d3cf227a85d7e79f5d6b4efb6bde3e8.jpg)

![[桜井宁宁] 爆乳奶牛少女cos写真-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/d40483e126fcf567894e89c65eaca655.jpg)