任务是指在执行特定作业时与用户交互的一系列Activity,这些Activity按照各自的打开顺序排列在堆栈中。
管理任务
使用清单文件元素中的属性和传递给startActivity()的Intent中的标志,可以执行一些非正常的操作。
可以使用的主要属性有:
taskAffinity
launchMode
allowTaskReparenting
clearTaskOnLaunch
alwaysRetainTaskState
finishOnTaskLaunch
可以使用的Intent标志包括:
FLAG_ACTIVITY_NEW_TASK
FLAG_ACTIVITY_CLEAR_TOP
FLAG_ACTIVITY_SINGLE_TOP
定义启动模式
使用清单文件
在清单文件中声明Actiavity时,您可以指定Activity在启动时应该如何与任务关联。
使用Intent标志
调用startActivity()时,可以在Intent中加入一个标志,声明新Activity是否与当前任务关联。
使用清单文件
在清单文件中声明 Activity 时,您可以使用 元素的 launchMode 属性指定 Activity 应该如何与任务关联。
“standard”:
默认。系统在启动 Activity 的任务中创建 Activity 的新实例并向其传送 Intent。Activity 可以多次实例化,而每个实例均可属于不同的任务,并且一个任务可以拥有多个实例。
“singleTop”:
如果当前任务的顶部已存在 Activity 的一个实例,则系统会通过调用该实例的 onNewIntent() 方法向其传送 Intent,而不是创建 Activity 的新实例。
“singleTask”:
系统创建新任务并实例化位于新任务底部的 Activity。但是,如果该 Activity 的一个实例已存在于一个单独的任务中,则系统会通过调用现有实例的 onNewIntent() 方法向其传送 Intent,而不是创建新实例。
“singleInstance”:
与 “singleTask” 相同,只是系统不会将任何其他 Activity 启动到包含实例的任务中。该 Activity 始终是其任务唯一仅有的成员;由此 Activity 启动的任何 Activity 均在单独的任务中打开。
处理关联
“关联”指示Activity优先属于哪个任务。默认情况下,同一应用中的所有Activity彼此关联。因此,默认情况下,同一应用中的所有Activity优先位于相同任务中。
可以使用元素的taskAffinity属性修改任何给定Activity的关联。
该值取字符串值,必须不同于在mainfest元素中声明的默认软件包名称。
在两种情况下,关联会起作用:
- 启动Activity的Intent包含 FLAG_ACTIVITY_NEW_TASK标志。
- Activity将其allowTaskReparenting属性设置为”true”
清理返回栈
如果用户长时间离开任务,则系统会清除所有Activity的任务,根Activity除外,当用户再次回到任务时,仅恢复根Activity。
可以使用下列几个属性修改此行为:
- alwaysRetainTaskState:如果在任务的根 Activity 中将此属性设置为 “true”,则不会发生刚才所述的默认行为。即使在很长一段时间后,任务仍将所有 Activity 保留在其堆栈中。
- clearTaskOnLaunch:如果在任务的根 Activity 中将此属性设置为 “true”,则每当用户离开任务然后返回时,系统都会将堆栈清除到只剩下根 Activity。 换而言之,它与 alwaysRetainTaskState 正好相反。 即使只离开任务片刻时间,用户也始终会返回到任务的初始状态。
- finishOnTaskLaunch:此属性类似于 clearTaskOnLaunch,但它对单个 Activity 起作用,而非整个任务。 此外,它还有可能会导致任何 Activity 停止,包括根 Activity。 设置为 “true” 时,Activity 仍是任务的一部分,但是仅限于当前会话。如果用户离开然后返回任务,则任务将不复存在。
启动任务
<activity ... >
<intent-filter ... >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
...
</activity>