1. 基本概念
1.1 任务 与 返回堆栈
任务是用户在执行某项工作时与之互动的一系列 Activity 的集合。
这些 Activity 按照每个 Activity 打开的顺序排列在一个返回堆栈中。
理解: task 在 stack 中?
例如,电子邮件应用可能有一个 Activity 来显示 新邮件列表。
当用户选择一封邮件时,系统会打开一个新的 Activity 来显示该邮件。
这个新的 Activity 会添加到返回堆栈中。
如果用户按返回按钮,这个新的 Activity 即会完成并从堆栈中退出。
Android 7.0(API 级别 24)及更高版本支持多窗口环境,当应用在这种环境中同时运行时,
系统会单独管理每个窗口的任务;而每个窗口 可能包含 多项任务。
1.2 任务启动
大多数任务都从设备主屏幕(Home screen)上启动。
当用户轻触应用启动器中的图标(或主屏幕上的快捷方式)时,该应用的任务就会转到前台运行。
如果该应用没有任务存在(应用最近 没有使用过),则会创建一个新的任务,
并且该应用的“主”Activity 将会作为堆栈的根 Activity 打开。
1.3 Activity启动、返回 与 返回堆栈
在当前 Activity 启动另一个 Activity 时,新的 Activity 将被推送到堆栈顶部并获得焦点。
上一个 Activity 仍保留在堆栈中,但会停止。
当 Activity 停止时,系统会保留其界面的当前状态。
当用户按返回按钮时,当前 Activity 会从堆栈顶部退出(该 Activity 销毁),
上一个 Activity 会恢复(界面会恢复到上一个状态)。
堆栈中的 Activity 永远不会重新排列,只会被送入和退出,
在当前 Activity 启动时被送入堆栈,在用户使用返回按钮离开时从堆栈中退出。
因此,返回堆栈按照“后进先出”的对象结构运作。
图 1 借助一个时间轴直观地显示了这种行为。
该时间轴显示了 Activity 之间的进展以及每个时间点的当前返回堆栈。
图 1. 有关任务中的每个新 Activity 如何添加到返回堆栈的图示。
当用户按返回按钮时,当前 Activity 会销毁,上一个 Activity 将恢复。
如果用户继续按返回,则堆栈中的 Activity 会逐个退出,以显示前一个 Activity,
直到用户返回到主屏幕(或任务开始时运行的 Activity)。
移除堆栈中的所有 Activity 后,该任务将不复存在。
1.4 再看任务
任务是一个整体单元,当用户开始一个新任务或通过主屏幕按钮进入主屏幕时,任务可移至“后台”。
在后台时,任务中的所有 Activity 都会停止,但任务的返回堆栈会保持不变,
当其他任务启动时,当前任务只是失去了焦点。
这样一来,任务就可以返回到“前台”,以便用户可以从他们离开的地方继续操作。
1.5 返回堆栈中的 Activity 不会被重新排列
由于返回堆栈中的 Activity 不会被重新排列,如果应用允许用户从多个 Activity 启动特定的 Activity,
系统便会创建该 Activity 的新实例并将其推送到堆栈中(而不是将该 Activity 的某个先前的实例移至堆栈顶部)
2. Activity 和 任务的默认行为总结
(1)当 Activity A 启动 Activity B 时,Activity A 会停止,
但系统会保留其状态(例如滚动位置和输入到表单中的文本)。
如果用户在 Activity B 中按返回按钮,系统会恢复 Activity A 及其状态。
(2)当用户通过按主屏幕按钮离开任务时,当前 Activity 会停止,其任务会转到后台。
系统会保留任务中每个 Activity 的状态。如果用户稍后通过点按该任务的启动器图标来恢复该任务,
该任务会进入前台并恢复堆栈顶部的 Activity。
(3)如果用户按返回按钮,当前 Activity 将从堆栈中退出并销毁。
堆栈中的上一个 Activity 将恢复。Activity 被销毁后,系统不会保留该 Activity 的状态。
(4)Activity 可以多次实例化,甚至是从其他任务对其进行实例化。
参考文献:
https://developer.android.com/guide/components/activities/tasks-and-back-stack