浅谈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);
    }
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值