Activity启动模式 任务栈 Task SingTop

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() 

isTaskRoot() 有意思的bug

任务栈查看

查看当前任务栈

以下命令可以查看手机中当前界面是哪个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"

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学知识拯救世界

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值