《Android开发艺术与探索》中对前台任务栈和后台任务栈的正确理解

一、问题背景

在《Android开发艺术与探索》的第1.2.1章节的singleInstance启动模式中,作者举出了下面的一个例子:

在一个应用中,它有A、B、C、D这4个活动,其中C是主活动,另外A、B的启动模式为standard,而C、D的启动模式为singleTask,并将C、D的taskAffinity属性设定为不同于该应用包名的一个字符串。这样可以保证A、B在名字为包名的任务栈中,而C、D在另一个不同的任务栈中。


首先我们打开这个应用,即最先启动C,再依次通过按钮跳转到活动D、A、B中,即启动各个Activity的顺序为C->D->A->B。这样操作后,从下图中我们可看出前台任务栈从栈底到栈顶分别为A、B两个Activity,后台任务栈从栈底到栈顶分别为C、D两个Activity。


现在我们所在的Activity是B,我们再通过按钮跳转到活动D,此时后台任务栈便会被切换到前台任务栈。而此时当用户点击3次手机Back按键时,列表中的Activity会依次按D->C->B->A顺序出栈,如下图所示:
《Android开发艺术与探索》中对前台任务栈和后台任务栈的正确理解_第1张图片

当博主李同学在看到上面描述的前台任务栈后台任务栈时,就很迷惑,因为Android官方并没有这2个概念,因为这2个概念是该书作者提出来的。后面博主上面查找资料后终于对此有了一些理解了。

二、前台任务栈后台任务栈的具体定义

前台任务栈后台任务栈的定义主要体现在两种不同的场景:两个不同应用中的前台任务栈后台任务栈,或者一个应用中的前台任务栈后台任务栈

1.两个不同应用中的前台任务栈后台任务栈

Activity的任务栈就是存放Activity对象实例的栈,默认情况下一个非系统应用只有一个任务栈,比如微信、QQ浏览器等。

因此两个不同应用中的前台任务栈后台任务栈的定义如下:

  1. 前台任务栈:当前处于前台并运行、可见并能和用户交互的APP应用所在的栈。
  2. 后台任务栈:当前处于后台、不可见也不能和用户交互的APP应用所在的栈。

举个例子,首先我们打开微信中与任意一个好友的聊天界面,此时微信的任务栈是前台任务栈,后台任务栈是空的。当我们点击该微信好友聊天内容中的一个网页链接时,微信首先用微信内置的浏览器打开该网页,接着我们还可以点击在浏览器打开,这样我们就可以用第三方浏览器打开并浏览这个网页了,如QQ浏览器。此时我们手机的显示界面从微信跳转到了QQ浏览器,这时QQ浏览器的任务栈便是前台任务栈,而微信的任务栈便是后台任务栈。当我们点击返回按钮时,QQ浏览器唯一的Activity被出栈,手机的显示界面又从QQ浏览器返回到了微信,此时微信的任务栈是前台任务栈,后台任务栈又空的。

2.一个应用中的前台任务栈后台任务栈

Activity的任务栈就是存放Activity对象实例的栈,默认情况下一个非系统应用只有一个任务栈,比如QQ、微信等。但对某些系统应用来说,一个系统应用可能有多个任务栈,因为这些系统应用的一些很重要的Activity的启动模式都被设置为singleInstance了,如手机桌面应用的桌面Activity、电话应用的通话Activity、闹钟系统应用的响铃Activity。当一个应用有多个任务栈时,在这一个应用中,该应用的任务栈就有了前台和后台之分了。

因此一个应用中的前台任务栈后台任务栈的定义如下:

  1. 前台任务栈:当前处于前台并运行、可见并能和用户交互的Activity所在的栈。
  2. 后台任务栈:当前处于后台、不可见也不能和用户交互的Activity所在的栈。

参考文献:
[1]Activity启动模式与任务栈(Task)全面深入记录(上)
[2]Activity的任务栈(启动模式等)
[3]问:Activity有几种任务栈?和Activity的关系是怎样的?

你可能感兴趣的:(Android开发知识)