Activity的任务栈|青训营笔记

109 阅读3分钟

Activity的任务栈|青训营笔记

这是我参与「第四届青训营 」笔记创作活动的第3天

以下是通过课程学习记录的笔记,同时搜索各种资料进行补充

(1)什么是任务栈

在使用APP过程中,不可避免页面之间的跳转,那么就会涉及到启动模式。其实在对界面进行跳转时,Android系统既能在同一个任务中对Activity进行调度,也能以Task(任务栈)为单位进行整体调度。在启动模式为standard或singleTop时,一般是在同一个任务中对Activity进行调度,而在启动模式为singleTask或singleInstance是,一般会对Task进行整体调度。

未显式声明 taskAffinity 的 Activity 都具有默认的任务栈,该任务栈的名称是应用包名。

若有多个任务栈,退出时优先从前台交互的栈(Activity)开始,先把栈中Activity退出后再到下一个栈,栈之间的顺序遵从出栈入栈规则

(2)特点

application中有很多activity,application是通过任务栈的形式对管理这些activity。

  • 任务栈是app管理activity的一种容器,遵循先进后出原则
  • 一个app默认只有一个任务栈,由系统指定
  • 一个app可以有多个任务栈,需要开发者手动指定
  • 多任务栈出栈(点击back)规则:出栈时,先将前台栈(当前与用户交互的栈)清空,再去清空后台栈

(3)taskAffinity

taskAffinity就是activity的任务栈的相关性。拥有相同affinity的activity在概念上属于同一个task。一个task的affinity取决于这个task内的根activity的taskaffinity。taskaffinity属性用于指定当前Activity所关联的任务栈,它的作用主要有:

  • 通过FLAG_ACTIVITY_NEW_TASK标记给activity指定任务栈
  • 决定Activity重新归属的任务(与allowTaskReparenting联合实现把一个应用程序的activity移到另一个程序的任务栈中)。默认情况下,application中所有的activity拥有相同的affinity(application包名),可以通过给taskaffinity属性设置不同的值把他们分组。甚至可以把多个application中的activity放到同一个task中。如果这个属性没有被设置,那么此属性的值就继承自application的此属性的值(查看 application的taskaffinity属性)。默认的值为application的包名。

(4)allowTaskReparenting属性

当某个拥有相同 affinity 的任务即将返回前台时,Activity 是否能从启动时的任务栈转移至此任务栈中去 —“true”表示可以移动,“false”表示它必须留在启动时的任务中。

通常在启动时,Activity 就与启动时它的任务栈相关联,并在整个生命周期都位于此任务栈中,当当前的 Task 不再显示时,可以利用这个属性强行让 Activity 在当前任务栈中不再显示时归属于另一个与其 affinity 相同的任务栈中。

典型应用场景

让一个应用程序的 Activity 转移到另一个应用程序关联的主任务中去:

例如在一封 email 邮件中包含一个 web 页面的链接,点击它就会启动一个 Browser Activity 来显示这个页面,这个 Activity 时由 Browser 应用程序定义的,但是现在它作 email Task 的一部分,将它的 allowTaskReparenting 设置为 true,如果 Browser 下一次进入前台时(打开浏览器),它就会根据 taskAffinity 属性重新宿主到 Browser Task 栈中,它就能被看见,并且会在 e-mail 任务再次回到前台时消失