background image

一些情况下

Android 需要知道哪个任务的活动附属于一个特殊的任务,即使该任务还

没有被启动。这通过任务亲和力来完成,它为任务中一个或多个可能要运行的活动提供一个
独一无二的静态名字。默认为活动命名的任务亲和力的名字,就是实现该活动

.apk 包的名字。

这提供一种通用的特性,对用户来说,所有在

.apk 包里的活动都是单一应用的一部分。

当不带

 Intent.FLAG_ACTIVITY_NEW_TASK 标记启动一个新的活动,任务亲和力对

新启动的活动将没有影响作用:它将一直运行在它启动的那个任务里。然而,如果使用
NEW_TASK 标记,亲和力会检测已经存在的任务是否具有相同的亲和力。如果是,该任务
会被切换到前台,新的活动会在任务的最上面被启动。

你可以在你的表现文件里的应用程序标签里为

.apk 包里所有的活动设置你自己的任务

亲和力,当然也可以为单独的活动设置标签。这里有些例子演示如何使用:

如果你的

.apk 包里包含多个用户可启动的上层应用程序,那么你可能想要为每个活动

分配不同的亲和力。这里有一个不错的协定,你可以将不同的名字字串加上冒号附加在

.apk

包 名 字 的 后 面

  。   例 如 , "com.android.contacts" 的 亲 和 力 命 名 可 以

"com.android.contacts:Dialer" and "com.android.contacts:ContactsList"。 

如果你想替换一个通知,快捷键,或者其它能从外部启动的应用程序的内部活动,你

需要在你想替换的活动里明确的设置任务亲和力

(taskAffinity)。例如,如果你想替换联系人

详细信息浏览界面(用户可以直接操作或者通过快捷方式调用),你需要设置任务亲和力
(taskAffinity)为“com.android.contacts”。 

启动模式以及启动标记

你控制活动和任务通信的最主要的方法是通过设置启动模式的属性以及意图相应的标

记。这两个参数能以不同的组合来共同控制活动的启动结果,这在相应的文档里有描述。这
里我们只描述一些通用的用法以及几种不同的组合方式。

你最通常使用的模式是

singleTop(除了默认为 standard 模式)。这不会对任务产生什么

影响;仅仅是防止在栈顶多次启动同一个活动。

 

singleTask 模式对任务有一些影响:它能使得活动总是在新的任务里被打开(或者将已

经打开的任务切换到前台来)。使用这个模式需要加倍小心该进程是如何和系统其他部分交
互的,它可能影响所有的活动。这个模式最好被用于应用程序入口活动的标记中。(支持
MAIN 活动和 LAUNCHER 分类)。

singleInstance 启动模式更加特殊,该模式只能当整个应用只有一个活动时使用。

有一种情况你会经常遇到,其它实体(如搜索管理器

SearchManager 或者 通知管理器

NotificationManager ) 会 启 动 你 的 活 动 。 这 种 情 况 下 , 你 需 要 使 用

 

Intent.FLAG_ACTIVITY_NEW_TASK 标记,因为活动在任务(这个应用/任务还没有被启
动)之外被启动。就像之前描述的一样,

 这种情况下标准特性就是当前和任务和新的活动

的亲和性匹配的任务将会切换到前台,然后在最顶端启动一个新的活动。当然,你也可以实
现其它类型的特性。