浅谈android:taskAffinity属性及问题解决

概念

与 Activity 有着相似性的任务。从概念上讲,具有同一相似性的 Activity 归属同一任务(从用户的角度来看,则是归属同一“应用”)。
默认情况下,应用中的所有 Activity 都具有同一相似性(即包名)。您可以设置该属性,以不同方式将其分组,甚至可以在同一任务内放置不同应用中定义的 Activity。如要指定 Activity 与任何任务均无相似性,请将其设置为空字符串。
如果未设置该属性,则 Activity 会继承为application的相似性(taskAffinity属性)。

分析

  1. taskAffinity表示当前activity具有亲和力的一个任务(翻译不是很准确,原句为The task that the activity has an affinity for.),大致可以这样理解,这个 taskAffinity表示一个任务,这个任务就是当前activity所在的任务。
    在概念上,具有相同的affinity的activity(即设置了相同taskAffinity属性的activity)属于同一个任务。

  2. 一个任务的affinity决定于这个任务的根activity(root activity)的taskAffinity。

  3. 这个属性决定两件事:当activity被re-parent时,它可以被re-paren哪个任务中;当activity以FLAG_ACTIVITY_NEW_TASK标志启动时,它会被启动到哪个任务中。(这个比较 难以理解,请结合中的属性allowTaskReparenting和Intent中的标志 FLAG_ACTIVITY_NEW_TASK加以理解)

  4. 默认情况下,activity未设置taskAffinity属性,会从application中继承taskAffinity属性,若application未设置该属性则默认为包名。

  5. 为一个activity的taskAffinity设置一个空字符串,表明这个activity不属于任何task。

  6. 可以利用该属性对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);
    }

猜你喜欢

转载自blog.csdn.net/seevc/article/details/127508235