概念
与 Activity 有着相似性的任务。从概念上讲,具有同一相似性的 Activity 归属同一任务(从用户的角度来看,则是归属同一“应用”)。
默认情况下,应用中的所有 Activity 都具有同一相似性(即包名)。您可以设置该属性,以不同方式将其分组,甚至可以在同一任务内放置不同应用中定义的 Activity。如要指定 Activity 与任何任务均无相似性,请将其设置为空字符串。
如果未设置该属性,则 Activity 会继承为application的相似性(taskAffinity属性)。
分析
taskAffinity表示当前activity具有亲和力的一个任务(翻译不是很准确,原句为The task that the activity has an affinity for.),大致可以这样理解,这个 taskAffinity表示一个任务,这个任务就是当前activity所在的任务。
在概念上,具有相同的affinity的activity(即设置了相同taskAffinity属性的activity)属于同一个任务。一个任务的affinity决定于这个任务的根activity(root activity)的taskAffinity。
这个属性决定两件事:当activity被re-parent时,它可以被re-paren哪个任务中;当activity以FLAG_ACTIVITY_NEW_TASK标志启动时,它会被启动到哪个任务中。(这个比较 难以理解,请结合中的属性allowTaskReparenting和Intent中的标志 FLAG_ACTIVITY_NEW_TASK加以理解)
默认情况下,activity未设置taskAffinity属性,会从application中继承taskAffinity属性,若application未设置该属性则默认为包名。
为一个activity的taskAffinity设置一个空字符串,表明这个activity不属于任何task。
可以利用该属性对activity进行分组。
遇到的坑及解决方案
1.给activity设置android:taskAffinity=“”后,同一个App出现多个最近任务窗口
解决方案:
:
1)可以显示配置为包名,如:android:taskAffinity=“${applicationId}”
,打包时会自动替换为包名。
2)针对设置了singleTask启动模式的Activity,通过设置addFlags方式启动Activity
public static void toActClearTop(Context mContext, Class<?> cls,Bundle bundle) {
Intent intent = new Intent(mContext, cls);
if (bundle != null) {
intent.putExtras(bundle);
}
//该方式替换singleTask启动模式
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
mContext.startActivity(intent);
}