技术标签: Android 应用开发 Activity 亲和性 任务亲和性 taskAffinity
任务亲和性 ( taskAffinity ) 简介 :
① 亲和性概念 : 任务亲和性 ( taskAffinity ) 是 Activity 的属性 , 用于设置该 Activity 倾向于哪个任务 ;
关于任务的概念参考 : 【Android 应用开发】Android 返回堆栈 与 任务
② 任务亲和性 ( taskAffinity ) 属性值 : 该值是软件包的 包名 , 定义在 AndroidManifest.xml 或 build.gradle 配置文件 中 ;
( 如 : “com.android.example” )
<activity android:name=".MainActivity"
android:launchMode="standard"
android:taskAffinity="com.android.example"/>
③ 任务亲和性 ( taskAffinity ) 设置效果 : 具有相同的 任务亲和性 ( taskAffinity ) 属性的 Activity , 会倾向于放在同一个任务 ( 返回堆栈 ) 中 ;
1 . Activity 默认的 任务亲和性 ( taskAffinity ) 属性 : 如果开发者没有指定该 Activity 的 taskAffinity 属性 , 那么该值默认就是该应用的包名 ;
2 . 任务亲和性的三种情况 :
① 相同应用 , 相同的亲和性 ( 默认状态 ) : 相同的应用会默认其 Activity 具有相同的亲和性 , 其属性值就是 本身应用的 包名 , 默认设置下 , 每个打开的 Activity 界面都放在同一个 任务 ( 返回堆栈 ) 中 ;
② 相同应用 , 不同的亲和性 : 如果在同一个应用中 , 为 某个 Activity 设置了不同的亲和性 , 那么打开这个 Activity 界面时 , 就会在其它的任务中打开该界面 ;
③ 不同应用 , 相同的亲和性 : 如果其它应用 Activity 界面的亲和性 属性就是本应用的包名 , 那么打开该 Activity 界面时 , 该界面就会放入本应用的 返回堆栈中 ;
3 . 注意事项 : 如果要设置 任务亲和性 ( taskAffinity ) 属性 , 该值不能是应用的默认包名 , 只能设置其它的包名 ;
( 即 : 如果设置亲和性属性 , 那么就要设置成不一样的 , 默认的就不要再显示的设置一遍了 ; )
1 . 讨论的前提条件 :
① 应用 A : 开发了 应用 A , 其中有界面 Activity A ;
② 应用 B : 开发了 应用 B , 其中有界面 Activity B ( 设置默认的亲和性 ) ;
2 . 界面跳转 ( 目的界面为默认启动模式 )
在 任务 A 中的 Activity A 调用 startActivity() 方法跳转界面 Activity B ( standard 默认启动模式 ) 时 , 新启动的 Activity B 界面 默认 会放到 任务 A 的返回堆栈 A 中 ;
3 . 界面跳转 ( 目的界面为 singleTask 启动模式 )
在 任务 A 中的 Activity A 调用 startActivity() 方法跳转界面 Activity B ( singleTask 启动模式 ) 时 , 新启动的 Activity B 的归属 , 即放在哪个 任务中 , 分以下两种情况 :
① 如果 当前 应用 B 没有运行 : 那么会创建一个新的 任务 , 将 Activity B 界面放入该新任务的返回堆栈中 ;
② 如果 当前 应用 B 的 任务 B 处于后台 : 那么会将 任务 B ** 到前台运行 , 并将 Activity B 放入 任务 B 的返回堆栈栈顶 ;
1 . 下面讨论 android:allowTaskReparenting 属性 设置为 true 的情况 :
<activity android:name=".ActivityA"
android:launchMode="standard"
android:taskAffinity="com.android.exampleA"
android:allowTaskReparenting="true"/>
2 . android:allowTaskReparenting 属性作用 :
① 任务 A : 当有一个任务 A , 与 Activity A 有亲和性 ;
② 任务 B : 当前 Activity A 处于 任务 B 的返回堆栈中 , Activity A 界面是在 任务 B 中启动的 ;
③ 设置属性为 true 的结果 : 当任务 A 进入了前台运行 , Activity A 就会转移到 任务 A 的返回堆栈中 ;
3 . 举例说明 :
① 应用 A : 开发了 应用 A , 其中有界面 Activity A1 ;
② 应用 B : 开发了 应用 B ;
③ 动作 1 : 在 应用 B 中启动了 Activity A1 , 此时 Activity A1 是放在 应用 B 的 任务 B 中 , 即 返回堆栈 B ;
④ 动作 2 : 如果此时启动 应用 A , 即 应用 A 的 任务 A 进入了前台运行 , 则 处于 任务 B 中的 Activity A1 会转移到 任务 A 中运行 ;
概念 与 Activity 有着相似性的任务。从概念上讲,具有同一相似性的 Activity 归属同一任务(从用户的角度来看,则是归属同一“应用”)。 默认情况下,应用中的所有 Activity 都具有同一相似性(即包名)。您可以设置该属性,以不同方式将其分组,甚至可以在同一任务内放置不同应用中定义的 Activity。如要指定 Activity 与任何任务均无相似性,请将...
参考:Activity之taskAffinity属性、allowTaskReparenting属性和Android退出整个应用解决方案 Activity 的 affinity 由 taskAffinity 属性定义。 任务的 affinity 由根 Activity 的 affinity 确定。 然而,根据规定,根 Activity 总是位于 affinity 同名的任务中。 因为以“...
taskAffinity浅析 默认如果没配taskAffinity属性的Activity的taskAffinity是包名 同一个安装包下的相同进程,它们的默认taskAffinity都是包名 同一个安装包下的不同进程,它们的默认taskAffinity也是包名 验证如下: dump日志 可以看到三个ActivityRecord都是在同一个栈里,因此和进程没关系 同一个taskAffinity的Ac...
正常情况下,如果应用已经启动,并将应用切到后台,在通知栏中调起页面时,该应用的Task首先会被调起,然后会将我们的Activity显示在这个Task的顶端。手机百度的通知栏里面有一个快速搜索栏,无论什么情况下,点击之后都会直接弹出搜索页面,透明背景后显示的是桌面。怎么来实现这个功能呢?这就要提到我们的主角TaskAffinity了。 什么是affinity? affinity是指Activit...
正常情况下,如果应用已经启动,并将应用切到后台,在通知栏中调起页面时,该应用的Task首先会被调起,然后会将我们的Activity显示在这个Task的顶端。手机百度的通知栏里面有一个快速搜索栏,无论什么情况下,点击之后都会直接弹出搜索页面,透明背景后显示的是桌面。怎么来实现这个功能呢?这就要提到我们的主角TaskAffinity了。 什么是affinity? affinity是指Activit...
正常情况下,如果应用已经启动,并将应用切到后台,在通知栏中调起页面时,该应用的Task首先会被调起,然后会将我们的Activity显示在这个Task的顶端。手机百度的通知栏里面有一个快速搜索栏,无论什么情况下,点击之后都会直接弹出搜索页面,透明背景后显示的是桌面。怎么来实现这个功能呢?这就要提到我们的主角TaskAffinity了。 什么是affinity? affinity是指Activi...
我们首先要有task这个概念,我们可以把task看作存放运行时Activity的集合,也就是一个存放我们App中Activity任务栈 系统按照启动的顺序把Activity有序的存放在里面。 而 taskAffinity叫做归属,可以把它理解成把Activity分组的意思,它会把具有相同的Activity“吸附”进一个新的任务栈,可能有人跟我一样没了解这个属性根本看不到有哪...
启动模式还是比较难以理解的,虽然我尽量用最简单的方式来陈述,但原谅在下装逼功力有限,建议还是必须对着代码敲一遍 一: Actiivity和Task Activity属于哪个Task,由什么来决定的? Activity会一直在这个task中吗? 如果不是又会到什么样的task中呢? 这一切都可以在Activity的taskAffinity属性中找到答案,Activity的taskAffinity属性...
下列场景的测试环境: 1、模拟机,Android 版本 8.0.0 2、开发环境: 1、taskAffinity 用于设置 activity 对于 Task 的亲和力,而 Task 的亲和关系由 Task 中的根 Activity 确定,即根 Activity 的 affinity 决定着 Task 的 affinity 值。 2、但是并不是设置了 taskAffinity 值,Activity ...
最近做一个打电话相关的小app,用到了2个平时了解得少的属性,也是看到一个国外相同项目这个做的,开始是直接复制过来的,没去详细了解,项目中期时,随手删了2行配置的属性,由于平时基本没用到,所以以为用处不大,结果出了写小问题,这里记录一下。不废话了,直接贴代码和解释吧,以下是我测试后的个人理解。 [color=darkred][b]注意:[/b][/color] 以上2个activity不在同一...