Android 近期任务列表

三味码屋 2023年09月01日 675次浏览

近期任务列表

Android 5.0(API 级别 21)引入了以文档为中心的模型。如果同一 Activity 的多个实例包含不同的文档,每一个文档可能各自都有一个任务,会在系统近期任务列表显示为任务。
可以使用 ActivityManager.AppTask 类来管理任务,并使用 Intent 标记来指定在近期任务列表添加或移除 Activity 的时间,还可以使用 <activity> 属性在清单中设置行为。

将任务添加到系统近期任务列表

使用 Intent 标记添加任务,可以更好地控制在近期任务列表中打开或重新打开文档的方式和时间。使用 <activity> 属性时,可以选择始终在新任务中打开文档或重复使用文档的现有任务。

使用 Intent 标记添加任务

Activity 创建新文档时,可以调用 startActivity() 方法并向启动该 Activity 的 intent 添加 FLAG_ACTIVITY_NEW_DOCUMENT 标记。

注意:FLAG_ACTIVITY_NEW_DOCUMENT 标记取代了 FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET 标记,后者自 Android 5.0(API 级别 21)起已弃用。

如果在创建新文档时,同时设置了 FLAG_ACTIVITY_MULTIPLE_TASK 标记,则始终会以目标 Activity 为根来创建新任务。

注意:使用 FLAG_ACTIVITY_NEW_DOCUMENT 标记启动的 Activity 必须在清单中设置 android:launchMode="standard" 属性值(默认值)。

当主 Activity 启动一个新 Activity 时,系统会在现有任务中进行搜索,看是否任务的 intent 与该 Activityintent 组件名称和 Intent 数据匹配。如果未找到该任务,或 intent 包含 FLAG_ACTIVITY_MULTIPLE_TASK 标记,那么将以该 Activity 为根创建一个新任务。如果找到该任务,则会将其带到最前端,并将新 intent 传递到 onNewIntent()。

使用 Activity 属性添加任务

Activity 还可以在其清单中使用 <activity> 属性 android:documentLaunchMode 指定始终启动到新任务。该属性具有四个值,在用户使用应用打开文档时分别会产生以下效果:

  • "intoExisting"
    Activity 重复使用文档的现有任务。这与设置了 FLAG_ACTIVITY_NEW_DOCUMENT 标记但没有设置 FLAG_ACTIVITY_MULTIPLE_TASK 标记的效果相同。
  • "always"
    Activity 会为文档创建新任务,即使文档已打开也一样。使用该值与同时设置了 FLAG_ACTIVITY_NEW_DOCUMENTFLAG_ACTIVITY_MULTIPLE_TASK 标记的效果相同。
  • "none"
    Activity 不会为文档创建新任务。近期任务列表会以默认方式处理 Activity:它会显示应用的单个任务,该任务是从用户上次调用的任何 Activity 恢复的。
  • "never"
    Activity 不会为文档创建新任务。设置该值会替换 FLAG_ACTIVITY_NEW_DOCUMENTFLAG_ACTIVITY_MULTIPLE_TASK 标记的行为(如果在 intent 中设置了任意一个),而且近期任务列表会显示应用的单个任务,该任务是从用户上次调用的任何 Activity 恢复的。

注意:如果值不是 none 和 never,必须使用 launchMode="standard" 定义 Activity。如果未指定此属性,会使用 documentLaunchMode="none"。

移除任务

默认情况下,当相关的 Activity 完成时,文档任务会自动从近期任务列表中移除。
可以使用 ActivityManager.AppTask 类、Intent 标记或 <activity> 属性来替换此行为。

<activity> 属性 android:excludeFromRecents 设置为 true,即可始终将任务从最近使用的应用屏幕中完全排除。

<activity> 属性 android:maxRecents 设置为一个整数,即可设置可在近期任务列表中包含的最大任务数。默认值为 16。一旦达到最大任务数,最早使用的任务将从最近使用的应用屏幕中移除。android:maxRecents 最大值为 50(内存较低的设备上为 25);小于 1 的值无效。

使用 AppTask 类移除任务

可以通过调用 finishAndRemoveTask() 方法来移除任务并结束与该任务相关联的所有 Activity

注意:使用 finishAndRemoveTask() 方法会替换 FLAG_ACTIVITY_RETAIN_IN_RECENTS 标记的使用,如下文所述。

保留已完成的任务

如果在任务的 Activity 结束后也希望在近期任务列表中保留它,可以将 FLAG_ACTIVITY_RETAIN_IN_RECENTS 标记传入启动该 ActivityIntent
要达到同样的效果,可以将 <activity> 属性 android:autoRemoveFromRecents 设置为 false。文档 Activity 的默认值为 true,常规 Activity 的默认值为 false。使用此属性会替换上文所述的 FLAG_ACTIVITY_RETAIN_IN_RECENTS 标记。

参考

“最近使用的应用”屏幕