Android 中的任务、任务栈以及返回栈

先看下面这张图

当我们从设备主屏幕上启动一个APP,就会启动一项任务,该应用的任务会转到前台,如果没有任务,系统会创建一个新任务, 如上图的Task A,APP入口点Activity 1作为任务栈中的根Activity打开。然后依次打开Activity 2、Activity 3,这些Activity会按照打开顺序压入到任务栈中,当按下Back键或是手势返回时,任务栈按照后进先出的顺序,完成当前栈顶的Activity 3,将其移除并销毁,前一个Activity 2重新成为栈顶,然后作为界面显示,当从堆栈中移除所有Activity后,任务也就结束不存在了。

如果返回栈中最后一个Activity是根启动器Activity, 也就是使用ACTION_MAIN 和 CATEGORY_LAUNCHER 声明 intent 过滤器的 activity,返回时,系统会根据设备运行的Android版本对该Activity做不同的处理。

Android 11 及更低版本中的系统行为

         系统完成 activity。

Android 12 及更高版本的系统行为

         系统会将 activity 及其任务移至后台,而不是完成 activity。此行为与使用主屏幕按钮或手势从应用中导航出去时的默认系统行为一致。

有了前面的了解,我们可以先总结一下了,虚线框表示的就是Back Stack,其中只有一个Task,里面各个Activity组成的堆栈结构就是任务栈,堆栈是后进先出的,已经在堆栈中的Activity之间的顺序不会改变。

但是,返回栈和任务栈感觉和看起来都差不多呀,我们需要用一个更复杂的场景来说明。

还是一样,先上图。

前面我们的例子太过简单中只启动了一个任务,所有的Activity的进栈出栈都在同一个Task上完成,现在我们除了有一个前台任务,还有一个后台任务,后台任务可以是同一个应用的,也可以是其他应用的,只是在启动Task A的时候, Task B被系统切换到了后台。

另外,后台任务的Activity Y其 <activity> 元素中指定了 singleTask 启动模式,不会置于Task A中 (来自其他应用或是具有不同亲和性)。

1、“singleTask模式: 系统会在新任务的根位置创建 activity,或将该 activity 放置在具有相同亲和性的现有任务上。”

2、默认情况下,同一应用中的所有 activity 都具有相同的任务亲和性(也就是包名):它们“更倾向于”位于同一任务中,不过可以通过<activity>元素的 taskAffinity属性修改默认亲和性。只要和包名不一致,该activity就会创建新任务来打开,如果已存在这样亲和性的任务带回前台,并根据launchMode创建新实例或是使用现有实例的onNewIntent接收intent。

接下来就是本文的关键了,Task A的Activity 2现在要打开Activity Y, 系统不会在Task A中打开Activity Y的新实例,而是将Task B置于前台,返回栈变成了从上而下排列着两个任务

此时按下Back, 退出Activity Y,我们并不会看到Activity 2,而是回退到Task B的 Activity X

直到Task B的任务栈移除所有Activity后,系统才会回到Task A并显示Activity 2。

任务栈和返回栈最根本的区别就是,返回栈也是一个堆栈管理结构,管理着多个任务,系统会调整任务在栈中的位置,比如Activity B启动Acitivy Y

会将Task B整体移动到Task C的前面,成为栈顶。回退的时候会依次将位于当前栈顶的Task中的Activity出栈,如果没有了,就回退到Home。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值