概述
最近在看 aosp 源码,Activity 启动流程中涉及到大量 Activity 处理细节,如果不从模型上掌握 Task, affinity 等概念,很容易看迷失在代码里。本文意在从模型上梳理 Activity 启动模式以及对应的设置代表的含意,为继续阅读源码打基础。
Task 与回退栈
一般情况,每个应用包含多个 Activity,这些 Activity 都放到一个栈中。对于一个打开多个 Activity 的应用来说,处于栈顶的 Activity 就是正在显示的页面,点击“返回”按钮时,这个当前栈顶元素被弹出,然后显示新的栈顶 Activity,一直点击“返回”键直接该应用栈中所有元素都被弹出,最后会展示桌面或应用的启动者页面。这个“返回”按钮在英语里叫 Back Button,所以这个栈就叫作 Back-Stack,中文翻译为“回退栈”,回退栈是自然语言中的叫法,在 Android 系统层次称一个回退栈为一个 task。上面说的都是一般情况,可以通过设置 Activity 的启动模式或添加 flags 显示“二般”情况。比如,一个应用可以有多个 Task,一个 Task 中包含多个应用的 Activity 等。下面说说影响 task 的几个属性和几个主要的 flags,看看它们具体直到什么作用。
activity 相关属性
- alwaysRetainTaskState: 保存整个 task 状态,默认情况下,如果一个 task 长期(比如 30 分钟)处于不可见状态,系统会将这个 task 的非 root 元素全部清空,对应于应用来说就是会只保留“首页”。将此属性置为 true 后,系统就不会清除 task 元素。注意,此属性只对 task 中 root 元素(不一定是 MainActivity)启作用。
- clearTaskOnLaunch: 与上面 alwaysRetainTaskState 相反,每次