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]
taskAffinity表示当前activity具有亲和力的一个任务栈,大致可以这样理解,这个 taskAffinity表示一个任务栈,这个任务栈就是当前activity所在的任务栈。
在概念上,具有相同的affinity的activity(即设置了相同taskAffinity属性的activity)属于同一个任务栈。
遇到的坑及解决方案
1.给activity设置android:taskAffinity=“”后,同一个App出现多个最近任务窗口
解决方案::
1)可以显示配置为包名,如:android:taskAffinity=“${applicationId}”,打包时会自动替换为包名。
2)针对设置了singleTask启动模式的Activity,通过设置addFlags方式启动Activity
- 全局唯一模式 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()
任务栈查看
查看当前任务栈
以下命令可以查看手机中当前界面是哪个Activity。
dumpsys activity top | grep ACTIVITY
如果未安装 grep for window.exe,请分开执行:
adb shell
然后
dumpsys activity top | grep ACTIVITY
C:\Users\liyd>adb shell
OP4E75L1:/ $ dumpsys activity top | grep ACTIVITY
ACTIVITY com.tencent.tmgp.cn.jj.chess2/cn.jj.mobile.lobby.view.Main efa40fb pid=3012
ACTIVITY com.android.launcher/.Launcher 7fd7067 pid=3989
ACTIVITY com.tencent.tmgp.cn.jj.chess2/com.tencent.ysdk.module.user.impl.wx.qrcode.QRActivity b2a7ba7 pid=3012
OP4E75L1:/ $
查看任务栈
adb -s 804c11f1 shell "dumpsys activity activities | grep 包名"
示例
adb -s 804c11f1 shell "dumpsys activity activities | grep cn.jj.launchmode"