浅谈android:taskAffinity属性及问题解决
Posted seevc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈android:taskAffinity属性及问题解决相关的知识,希望对你有一定的参考价值。
概念
与 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);
浅谈对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