Android应用程序模型之应用程序,任务,进程,线程分析

2019-12-10 19:23:40刘景俊

FLAG_ACTIVITY_NEW_TASK必 须谨慎使用:使用它意味着,在用户看来,一个新的应用程序由此起动。如果这不是你所期望的行为,你就不该去创建一个新的任务。另外,仅在用户可以从桌面返 回到他原来的地方和以一个新任务启动相同意图的情况下,你才应该使用新的任务标记。否则,如果用户在你已经启动的任务里按桌面(HOME)键,而不是返回(BACK)键,你的任务及其活动将被放置到桌面后面,没有办法再切换回去。

任务共用性Affinity

在某些情况下,Android需要知道一个活动属于哪个任务即使它没有被启动到一个具体的任务里。这是通过任务共用性(Affinities)完成的。任务共用性(Affinities)为这个运行一个或多个活动的任务提供了一个独特的静态名称,默认的一个活动的任务共用性(Affinity)是实现了该活动的.apk包的名字。这提供了预期的标准特性,即所有在一个特定的.apk包里的活动是单个用户应用程序的一部分。

当开始一个没有Intent.FLAG_ACTIVITY_NEW_TASK标志的活动时,任务共用性affinities不会影响将会运行该新活动的任务:它总是运行在启动它的任务里。但是,如果使用了NEW_TASK标志,那么共用性(affinity)将被用来判断是否已经存在一个有相同共用性(affinity)的任务。如果是这样,这项任务将被切换到前面而新的活动会启动于这个任务的顶层。

这种特性在您必须使用NEW_TASK标志的情况下最有用,尤其是从状态栏通知或桌面快捷方式启动活动时。结果是,当用户用这种方式启动您的应用程序时,它的当前任务将被切换到前台,而且想要查看的活动被放在最上面。

你可以在程序清单(Manifest)文件的应用程序application标签中为.apk包中所有的活动分配你自己的任务共用性Affinites,或者在活动标记中为各个活动进行分配。一些说明其如何使用的例子如下:

① 如果您的.apk包含多个用户可以启动的高层应用程序,那么您可能需要对用户看到的每个活动指定不同的affinities。一个不错的命名惯例是以附加一个以冒号分隔的字符串来扩展您的.apk包名。例如,“ com.android.contacts ”.apk可以有affinities:“com.android.contacts:Dialer”和“ com.android.contacts:ContactsList”。
② 如果您正在替换一个通知,快捷方式,或其他可以从外部发起的应用程序的“内部”活动,你可能需要明确设定您替代活动的taskAffinity和您准备替代的应用程序一样。例如,如果您想替换contacts详细信息视图(用户可以创建并调用快捷方式),你得把taskAffinity设置成“com.android.contacts”。