重新理解Activity启动模式,确认返回按钮到哪个界面 ...

前言:之前开发单个应用,把每个Activity声明为singleTask完事,最近开发车机系统相关的应用,各个应用间通过语音可来回跳转,点击返回时返回的Activity和预期不一致,于是研究了一下如何定位到当前Activity点返回会跳转到哪

车机系统 Android4.4

所需概念

task&stack

Android对于Activity的管理使用First in,Last out的数据结构,对所有的Activity都通过回退栈的方式来管理

启动activity实际上启动的activity所属的task,最顶部的activity处于onResume状态,这点一定要切记

放入stack里面的顺序不能重排序,只能遵从后入先出的原则(pop&push)

Home在一个Stack里面,其它应用在另一个Stack里面,通过Task ID管理

使用命令

adb shell dumpsys activity > E:\stack01.txt

adb shell dumpsys activity activities > E:\stack02.txt //生成的文件更详细

此时打开生成的文件找到Recent tasks:

img_193ed1144f1b67884bc9e77e8d98c318.png
stack.png

即表示当前所有系统管理activity栈,Recent #0是当前界面,点击返回即跳到Recent #1,一直返回到tasks结束或Home为止

"sz=1"表示当前task所拥有的Activity数量,在同一个task的Activity回退完后,才会到另一个task,一般来说一个应用拥有一个独立的task,(Home启动应用会通过Intent设置FLAG_ACTIVITY_NEW_TASK的flag)

启动模式与任务栈的关系

1.默认
默认情况下每次都启动一个新的Activity实例
2.singleTop
当前Activity在task顶部时,及当前正在交互的Activity需要重新打开时不会创建实例,而会走到onNewIntent里面

非顶部和默认情况下一致
3.singleTask
当前task里面有实例则会复用,回调onNewIntent,并将当前Activity上面的Activity弹出销毁
4.singleInstance
同singleTask类似,不同的是这个task里面只会有唯一一个Activity,启动其它Activity会放到新的一个task里面(可理解为给其它Activity设置FLAG_ACTIVITY_NEW_TASK)
标识)

有一点需要注意,对于从Home启动的Activity来说,会设置mOnTopOfHome=true,不管和Home是不是同一个Stack都会返回到主页

小技巧

没有给定API接口启动其他应用(跳到指定activity)尽量使用

   Intent intent = MyApp.getInstance().getPackageManager()
    .getLaunchIntentForPackage("com.example.otherpackage");

   MyApp.getInstance().startActivity(intent);

由系统判断Launcher category启动,如果手动启动需要根据当前方案设置intent的flag

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值