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启动模式-LMLPHP

扩展

判断是否为根activity。

 isTaskRoot() 

isTaskRoot() 有意思的bug

任务栈查看

adb -s 804c11f1 shell "dumpsys activity activities | grep  包名"
示例
adb -s 804c11f1 shell "dumpsys activity activities | grep  cn.jj.launchmode"

Activity启动模式-LMLPHP

04-14 08:25