Activity - 管理任务(一) 处理亲和性 (taskAffinity)

81 阅读3分钟

1. 概念

“亲和性”表示 Activity 倾向于属于哪个任务。

默认情况下,同一应用中的所有 Activity 彼此具有亲和性。
因此,在默认情况下,同一应用中的所有 Activity 都倾向于位于同一任务
不过,可以修改 Activity 的默认亲和性。

不同应用中定义的 Activity 可以具有相同的亲和性,
或者在同一应用中定义的 Activity 也可以被指定不同的任务亲和性。

2.使用方法

您可以使用 元素的 taskAffinity 属性修改任何给定 Activity 的亲和性。

taskAffinity 属性采用字符串值
该值必须不同于 元素中声明的默认软件包名称
因为系统使用 该名称 来 标识应用的默认任务亲和性

3. 亲和性可在两种情况下发挥作用:

3.1 当启动 Activity 的 intent 包含 FLAG_ACTIVITY_NEW_TASK 标记时

默认情况下,新 Activity 会启动到调用 startActivity() 的 Activity 的任务中。
它会被推送调用方 Activity 所在的返回堆栈中。

但是,如果传递给 startActivity() 的 intent 包含 FLAG_ACTIVITY_NEW_TASK 标记,
则系统会寻找其他任务容纳新 Activity。
通常会是一个新任务,但也可能不是
(1)如果已存在与新 Activity 具有相同亲和性的现有任务,则会将 Activity 启动到该任务中
(2)如果不存在,则会启动一个新任务。

如果此标记导致 Activity 启动一个新任务
而用户按下主屏幕按钮离开该任务,则必须为用户提供某种方式来返回到该任务。

有些实体(例如通知管理器)总是在外部任务中启动 Activity,
而不在它们自己的任务中启动,
因此它们总是将 FLAG_ACTIVITY_NEW_TASK 添加到传递给 startActivity() 的 intent 中。
如果您的 Activity 可由外部实体调用,而该实体可能使用此标记,
请注意用户可以通过一种独立的方式返回到所启动的任务,
例如使用启动器图标(任务的根 Activity 具有一个 CATEGORY_LAUNCHER intent 过滤器;请参阅下面的启动任务部分)。

3.2 当 Activity 的 allowTaskReparenting 属性设为 "true" 时

在这种情况下,一旦和 Activity 有亲和性的任务进入前台运行,
Activity 就可从其启动的任务转移到该任务。

比较少用这个??

举例来说,假设一款旅行应用中定义了一个报告 特定城市 天气状况的 Activity。
该 Activity 与同一应用中的其他 Activity 具有相同的亲和性(默认应用亲和性),
并通过此属性支持 重新归属。
当您的某个 Activity 启动 该天气预报 Activity 时,该天气预报 Activity 最初会和您的 Activity 同属于一个任务。
不过,当旅行应用的任务 进入 前台运行时,
该天气预报 Activity 就会被 重新分配 给 该任务并 显示在其中。

提示:如果一个 APK 文件中包含了就用户角度而言的多个“应用”,
您可能需要使用 taskAffinity 属性为**每个“应用”**所关联的 Activity 指定不同的亲和性。

参考文献:
developer.android.com/guide/compo…