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

Posted seevc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈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);
    

浅谈对Js面向对象的理解

    面向对象的语言有一个标志,那就是它们都有类的概念,通过类来创建任意多个具有相同属性和方法的对象。它是一种程序开发的方法,它将对象作为程序的基本单元,将逻辑和数据封装其中,以提高代码的灵活性、重用性和扩展性。对象是把数据及对数据的操作方法放在一起,作为一个相互依存的整体。简单的来说,就是很多属性放在集合中,而集合中的属性属性值一一对应,属性属性值也就是我们平时所说的键值对,其中键值可以是数据或函数。

它的属性类型包括 1.数据属性 2.访问器属性 其中数据属性包括以下四个,我们最常见的应该就是Value 了。 

Configurable:表示能否通过 delete 删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性。像前面例子中那样直接在对象上定义的属性,它们的这个特性默认值为 true。

Enumerable:表示能否通过 for-in 循环返回属性。像前面例子中那样直接在对象上定义的属性,它们的这个特性默认值为 true。

Writable:表示能否修改属性的值。像前面例子中那样直接在对象上定义的属性,它们的这个特性默认值为 true。

Value:包含这个属性的数据值。读取属性值的时候,从这个位置读;写入属性值的时候,把新值保存在这个位置。这个特性的默认值为 undefined。

然后再来说下访问器属性

Configurable:表示能否通过 delete 删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为数据属性。对于直接在对象上定义的属性,这个特性的默认值为true。

Enumerable:表示能否通过 for-in 循环返回属性。对于直接在对象上定义的属性,这个特性的默认值为 true。

Get:在读取属性时调用的函数。默认值为 undefined。
Set:在写入属性时调用的函数。默认值为 undefined。

 


以上是关于浅谈android:taskAffinity属性及问题解决的主要内容,如果未能解决你的问题,请参考以下文章

为啥行为不同?- android:launchMode="singleTask" , android:taskAffinity="" 和 Intent.FLAG

浅谈javascript的原型及原型链

浅谈Kotlin:类

浅谈对Js面向对象的理解

浅谈HTTP Cookie 的 Secure 和 HTTPONLY属性

浅谈卷积神经网络及matlab实现