Activity的启动模式
首先activity启动之后是放在任务栈中的,task stack,既然是栈,遵循先进后出原则。有玩家比喻oncreate是入栈,onDestroy是出栈。
同一个APP中,不同的activity可以设置为不同的启动模式。在manifest中的activity属性中进行设置:
<activity android:name=".LoginActivity"
android:screenOrientation="landscape"
android:configChanges="orientation|screenSize|keyboardHidden"
android:launchMode="singleTask"
android:exported="true">
- 默认启动模式 standard
标准的启动模式,每次oncreate都会入栈一个activity,比如当前为activity2,栈内为
[activity2]
此时再启动activity2,栈内为
[activity2,activity2]
- 栈顶复用模式 singleTop
比如当前为activity2,栈内为
[activity2]
此时再启动activity2,则栈内为
[activity2]
此时再启动activity1,则栈内为
[activity2,activity1]
- 栈内复用模式 singleTask
弹出之上的所有activity。适用于主界面以及占用资源较多的界面。
比如当前为activity2(singleTask),栈内为
[activity2]
此时再启动activity2,则栈内为
[activity2]
此时再启动activity1 (standard),则栈内为
[activity2,activity1]
此时再启动activity3 (standard),则栈内为
[activity2,activity1, activity3 ]
此时再启动activity2 (standard),则栈内为
[activity2]
- 全局唯一模式 singleInstance
该模式会创建一个task来单独存放对应的activity。新的task有且只有这一个activity实例。
activity1(standard )、activity2(standard )、activity3(singleInstance)
启动activity1
[activity1]---task1---foreground
启动activity3
[activity1]---task1---background
[activity3]---task2---foreground
启动activity2
[activity1,activity2]---task1---foreground
[activity3]---task2---background
启动activity3
[activity1,activity2]---task1---background
[activity3]---task2---foreground
启动activity2
[activity1,activity2,activity2]---task1---foreground
[activity3]---task2---background
程序动态启动activity
扩展
判断是否为根activity。
isTaskRoot()
isTaskRoot() 有意思的bug
任务栈查看
adb -s 804c11f1 shell "dumpsys activity activities | grep 包名"
示例
adb -s 804c11f1 shell "dumpsys activity activities | grep cn.jj.launchmode"