所谓的 task ,是指用户完成某一项任务时与之交互的一组 Activity。比如用户要向开发者汇报
bug,先打开程序主页,然后打开关于页面,再点击报告 bug 按钮,打开编辑邮件页面。当前这三个 Activity 就构成了一个 task 。 task 中的
Activity 以栈的形式管理,遵循”先进先出“的原则 。通常我们不需要关心其组织方式,但在一些情况下你可能想自定义 task
的一些行为。要实现这一点,需要了解以下属性:
- taskAffinity
- launchMode
- allowTaskReparenting
- clearTaskOnLaunch
- alwaysRetainTaskState
- finishOnTaskLaunch
<activity>
元素下。有些属性是针对整个 task 的,只有在根 Activity 下才会生效。
Launch Modes
Launch Mode 决定了 Activity 在 task 中的行为与组织方式。有两种方式可以一定义 Activity 的 Launch Mode,一种是通过 Intent Flags,另一种是在 Manifest.xml 中<activity>
标签下定义
launchMode
属性,launchMode 属性的值包括
standard,singleTop,singleTask,singleInstance 四种。(如果两种方式都有声明,则 Intent 中的
flag 值会覆盖 Manifest 中的 launchMode 属性。)
注意:Intent Flag 值与 launchMode 并不一一对应。因此某些行为只能通过其中一种方式实现以下主要讲 launchMode 属性。 standard 是默认的启动方式,允许多个 Activity 实例存在,singleTop 要求栈顶只存在一个 Activity 实例,类似于在 Intent 中添加
FLAG_ACTIVITY_SINGLE_TOP
标记。
如:栈中有 A,B,C,D,在 D 中再启动 D ,默认情况下会变为 A,B,C,D,D,而加上此标记后仍为 A,B,C,D
,而 D 的 onNewIntent()
方法会被回调到。
当 Activity 的启动方式为
singleTask 或 singleInstance 时,该 Activity 在系统中只会有一个实例。即系统在启动 Activity 时,如果当前某个
task 中存在 Activity 实例,则直接将该 task 推至前台。区别在于,singleInstance 要求其任务栈中只能有这一个
Activity,通过此 Activity 启动的 Activity 会被放至另外的 task 中,而singelTask 则无此要求。 如果 task
被推至前台时,singleTask 的 Activity 的顶层还有其它 Activity,则顶层的 Activity 会被全部清除掉。因此使用
singleTask 启动模式类似于 Intent 中添加 FLAG_ACTIVITY_NEW_TASK
与
FLAG_ACTIVITY_CLEAR_TOP
标记。(仍有轻微区别:使用 singleTask launchMode
时,Activity 不会重新创建,只会调用 onNewIntent()方法;而使用 intent flag 时,Activity
被重新创建)
如果 lauch mode 为 singleTask 的 Activity 不是根 Activity,则按返回键时,会一直返回到该 task 的根 Activity,再返回到之前启动它的 Activity。如下图所示:
关于 launch mode 的更多详细内容请看这里。
参考:
Task Affinity
taskAffinity
属性,可理解为
Activity 所从属的 task。默认情况下,同一个应用程序下的 Activity 都从属于一个 task,但是可以对该属性进行修改使之依附不同 task。
该属性常用在两个地方:
- 当启动 Activity 的 Intent 包含 FLAG_ACTIVITY_NEW_TASK 标记时。如果系统中已经存在一个 task 与要启动的 Activity 有相同的 taskAffinity ,该 Activity 被压入该 task 中,否则启动一个新的 task。
- 当 Activity 的
allowTaskReparenting
属性值为true
时。通过程序 X 的 Activity A 启动程序 Y 的 Activity B,默认情况下 B 会被放入 A 所在的 task 中,再启动 Y 程序时 B 所在的 task 不变。如果 B 的allowTaskReparenting
值为true
,则当启动 Y 程序时 B 会被转压入到 Y 程序的 task 中。
清除任务栈
用户通过按 Home 键则最近程序列表离开当前应用程序,超过一定时间后(比如30分钟),系统会将 task 中的 Activity 清除掉,只保留根 Activity。因为用户长时间离开程序,可能想放弃或已经遗忘之前操作,重新打开程序时期待看到程序首页。 我们可以更改 Activity 的一些属性来改变这种行为。- alwaysRetainTaskState:始终保持所有 Activity,不清除。
- clearTaskOnLaunch:始终清除非根 Activity,即使只离开很短时间。
- finishOnTaskLaunch:与 clearTaskOnLaunch 类似,但是只针对单个 Activity 而不是整个 task。(通过最近程序列表打开时不会清除)
原文地址:http://multi-thread.com/?p=74
参考: