Acitivty 是 Android 应用框架中最主要的组件之一。可以 Task/ Stack 的机制来管理 Activity 的行为模式。在 Android 的官方文档里已经对 Activity 的属性以及 Task/Stack 的概念进行了说明。在《应用程序基础》一文中也有对这一主题的相关说明。这里专门对此进行进一步的说明。
Stack 保存了一个应用程序的所有没有被销毁(destroy)的 Activity。例如依次启动了 A、B、C 三个 Activity 之后,该 stack 的状态即为 |A-B-C。当 C 执行了 finish() 方法或是用户点击了返回键之后,stack 的状态变为了 |A-B。
而 task 则可以理解为是在 stack 中对 activity 进行了一种分组。例如:|1A-1B- 2A-2B-2C- 3A 中根据后缀可以分为三个不同的 task。这时所显示的是 3A,三个 task 的根 Activty 分别是 1A、2A、3A。通常,一个 task 中的 activity 是成组移动的。例如通过长按 HOME 键选择了 2C 之后,stack 将变为 |1A-1B- 3A- 2A-2B-2C。默认情况下,所有的 activity 将会属于同一个 task。不过各个 activity 之间的从属关系也能够通过 taskAffinity 被重新定义。而如果 Intent 对象含有 FLAG_ACTIVITY_NEW_TASK 旗标,则将会选择一个新的 task。
不同的启动模式也会影响 task 的分配:
如果用户长时间不使用一个 task,该 task 就会被清除以释放内存。不过根 Activity 将会被保留。例如:|1A-1B- 2A-2B-2C- 3A 在这种情况下将变为 |1A- 2A- 3A。如果将根 Activity 的 alwaysRetainTaskState 属性设为 true,则该 task 中的所有活动都将被始终保留。如果将根 Activity 的 clearTaskOnLaunch 属性设为 true,则在用户离开该 task 时包括根 Activity 在内的这一 task 将被完整清除。如果将 task 中的某个 Activity 的 finishOnTaskLaunch 属性设为 true,则在离开该 task 并返回之后,这一 Activity 将被清除。