任务亲和性 ( taskAffinity ) 简介 II . 任务亲和性 ( taskAffinity ) 设置 III . 任务亲和性 ( taskAffinity ) 简介 ---- 任务亲和性 ( taskAffinity ) 简介 : ① 亲和性概念 : 任务亲和性 ( taskAffinity ) 是 Activity ="com.android.example"/> ③ 任务亲和性 ( taskAffinity ) 设置效果 : 具有相同的 任务亲和性 ( taskAffinity ) 属性的 Activity , 任务亲和性 ( taskAffinity ) 设置 ---- 1 . Activity 默认的 任务亲和性 ( taskAffinity ) 属性 : 如果开发者没有指定该 Activity 的 taskAffinity 属性 , 那么该值默认就是该应用的包名 ; 2 .
此 漏洞利用 APP 清单文件 AndroidManifest.xml 中 android:taskAffinity 的属性设置,使安装在 Android 设备上的恶 意应用可以伪装成该设备上的任意其他应用程序 上述检测时爱加固检测生成的报告信息 二、修改方案 ---- 在 AndroidManifest.xml 清单文件中 , 设置所有的 Activity 组件的亲和性属性 : android:taskAffinity
我们重点来看看taskAffinity这个标签 android:taskAffinity 官网解释 与 Activity 有着亲和关系的任务。 我们来总结一下上边文字包含的信息: TASK的taskAffinity是有它的根Activity的taskAffinity决定的; Activity的taskAffinity默认值为所在应用程序的包名; 此时是不是感觉很懵逼,没关系接下来我会讲述为什么会这样: taskAffinity.jpg 一个应用程序的所有Activity一个任务:一班情况下都这样(不设置taskAffinity 因为我们得出的第三个结论taskAffinity只会对singleTask、singleInstance有影响,所以在启动standard或者singleTop模式的Activity时不会对比taskAffinity 至于为什么在讲taskAffinity的时候已经介绍清楚了。实用场景官网的描述中也有,大家可以参考使用。
Intent.FLAG_ACTIVITY_NEW_TASK); 解释如下: FLAG_ACTIVITY_NEW_TASK:当Intent对象包含这个标记时,系统会寻找或创建一个新的task来放置目标Activity,寻找时依据目标Activity的taskAffinity 属性进行匹配,如果找到一个task的taskAffinity与之相同,就将目标Activity压入此task中,如果查找无果,则创建一个新的task,并将该task的taskAffinity设置为目标Activity 注意,如果同一个应用中Activity的taskAffinity都使用默认值或都设置相同值时,应用内的Activity之间的跳转使用这个标记是没有意义的,因为当前应用task就是目标Activity最好的宿主
taskAffinity 前面提到了 Activity 想要的任务栈, taskAffinity 的作用就是指定想要的任务栈。但它并不会在任何场景下都会起作用。 待启动的 Activity 会跟随源 Activity 的任务栈,即使你显式声明了不一样的 taskAffinity 。 除了 singleTask 和 singleInstance 以外,FLAG_ACTIVITY_NEW_TASK 也会使 taskAffinity 生效,后面会进行介绍。 其实到底是不是 “新” 的任务栈,这是还是由 taskAffinity 来决定的,这个在前面也讨论过了。 为什么设置了 taskAffinity ,还在同一个任务栈中呢?因为默认的启动模式是 standard,taskAffinity 并不会起作用。但是好像也并不是完全没有作用,接着看下面的操作。
activity的启动方式除了受标签android:launchMode的影响之外,还会被启动参数所左右,比如intent的标志位FLAG_ACTIVITY_NEW_TASK,任务标签 android:taskAffinity Test 1: 为了进行对比,先将SingleTaskActivity的属性设置为默认模式,并且不设置标签android:taskAffinity: <activity android:taskAffinity="com.zj.task"> <! 如果使用的话,会新建Task,所新建的位置依据标签android:taskAffinity而定(1.如果不指定则在被启动者所在App的Task内新建,当然前提是这个被启动者所在的App的Task已经存在 2.如果启动者和被启动者属于同一个app,需要设置标签android:taskAffinity以后,才会新建Task来启动,否则直接调用者所在Task内启动。
补充,官方解释并没有说明 taskAffinity属性对 singleTask的影响。 如果不设置 taskAffinity属性的话,即使设置为 singleTask,也会在原有的栈中实例化 Activity 所以 singleTask需要配合 taskAffinity使用才有效果 singleInstance 在不设置 taskAffinity的情况下,假设启动 activity的顺序是 A->B->C->D->B,而B设置了 singleTask,那么在最后启动完 会发生什么事呢? 其实面试经常考这个点。
对应的android:taskAffinity属性值。 android:taskAffinity表示Activity所在的任务,默认就是包名,若为空字符串,则表示Activity不属于任何Task;相同的taskAffinity的Activity则在同一个任务中 当然如果和android:taskAffinity配合使用,则可以在开启或者复用另外任务栈中来创建或重用Activity实例。 (3)复用已存在的任务栈 主要用在不同的应用之间可以将不同的Activity设置为相同的android:taskAffinity。 :taskAffinity设置为”com.j1.task4″。
这就引出了AndroidManifest.xml中标签下的taskAffinity属性。 taskAffinity 属性 taskAffinity 属性学名任务相关性,说白了其实就是这个参数可以指定当前activity所属任务栈的名字,该属性的值为字符串: 例: android:taskAffinity taskAffinity 与 singleTask 了解到taskAffinity属性后我们在重新梳理一下singleTask启动模式。 如果我们指定了taskAffinity属性的值,那么就跟之前分析的一样,创建新任务等等… 如果我们未指定taskAffinity属性的值,新activity就与当前任务的taskAffinity属性值一样 taskAffinity的其他作用 taskAffinity还有一个功能就是可以重新定向所属任务,意思就是这个activity原来是属于任务A的,当有一个跟该activity的taskAffinity属性值相同的任务
小结 5. taskAffinity属性 5.1. 配置方式 5.2. 意义(作用) 5.3. 举例 5.4. 回退顺序 5.5. 总结 1. 但是这个taskAffinity想必就不太熟悉了。 taskAffinity是标记当前activity附属到哪个task上的。 5.1. taskAffinity取值是一个字符串,用来唯一标识一个Task的。 默认情况下,也就是不配置,taskAffinity取的是应用的包名。 答案是,同时被指定了另一个taskAffinity属性值的时候。 5.4. 回退顺序 现在处于onResume的activity是ThirdActivity,如果这时候按返回键呢? 如果不存在,就看taskAffinity属性对应的Task是否存在,如果存在,就把Activity压入该Task内栈里;否则,就新建一个Task,再把Activity压入该Task内栈里。
--> 代码中,恶意活动的taskAffinity属性就是欲攻击应用的包名 allowTaskReparenting属性为true,这两个属性设置完成后就能使得恶意活动插入到合法活动前了, 为什么这么设置 属性了 taskAffinity直接翻译过来就是任务相关性, 官方文档对该属性的解释为: 从概念上讲,具有同一相似性的 Activity 归属同一任务(从用户的角度来看,则是归属同一“应用”)。 而确定应用相似性的属性就是taskAffinity 首先要知道,若应用没有特别定义taskAffinity的内容的话 则该应用中每个活动的taskAffinity属性的默认内容就是应用包名,所以在没有特别定义 taskAffinity的应用中,每个活动均在同一个任务栈中 重新查看恶意活动的清单文件代码 <activity android:name=".Attack" android:taskAffinity 的Activity,即使是跨程序也可以共享同一个任务栈 这就可以解释为什么需要恶意活动的taskAffinity属性为欲攻击应用的包名,这样就能让恶意活动与合法活动存在于同一任务栈中了 接着使恶意活动的
2.3 taskAffinity 我们可以在AndroidManifest.xml设置android:taskAffinity,用来指定Activity希望归属的栈, 默认情况下,同一个应用程序的所有的 Activity都有着相同的taskAffinity。 taskAffinity在下面两种情况时会产生效果。 taskAffinity与FLAG_ACTIVITY_NEW_TASK或者singleTask配合。 如果新启动Activity的taskAffinity和栈的taskAffinity相同(栈的taskAffinity取决于根Activity的taskAffinity)则加入到该栈中。 接着通过系统源码来查看taskAffinity的应用。
FLAG_ACTIVITY_SINGLE_TOP=singleTop FLAG_ACTIVITY_NEW_TASK 在相同taskAffinity情况下:启动activity是没有任何作用的。 FLAG_ACTIVITY_NEW_TASK和FLAG_ACTIVITY_CLEAR_TOP一起使用,并且要启动的activity的taskAffinity和当前activity的taskAffinity 如果启动同一个不同taskAffinity的activity才会有效果。 FLAG_ACTIVITY_NEW_TASK和FLAG_ACTIVITY_CLEAR_TOP启动和现在的activity不是同一个taskAffinity才会和singleTask一样的效果。 FLAG_ACTIVITY_CLEAR_TASK 在相同taskAffinity情况下:和FLAG_ACTIVITY_NEW_TASK一起使用,启动activity是没有任何作用的。
taskAffinity 属性 taskAffinity 属性学名任务相关性,说白了其实就是这个参数可以指定当前activity所属任务栈的名字,该属性的值为字符串: 例:android:taskAffinity taskAffinity 与 singleTask 了解到taskAffinity属性后我们在重新梳理一下singleTask启动模式。 如果我们指定了taskAffinity属性的值,那么就跟之前分析的一样,创建新任务等等... 如果我们未指定taskAffinity属性的值,新activity就与当前任务的taskAffinity属性值一样,所以新activity的实例会被放置到当前的任务栈中。 taskAffinity的其他作用 taskAffinity还有一个功能就是可以重新定向所属任务,意思就是这个activity原来是属于任务A的,当有一个跟该activity的taskAffinity属性值相同的任务
默认情况下每个activity的taskid相同 但是,如果自定义了栈的标签(这个标签相同的singletask activity在同一个作业栈中),那么taskid就会初选差别 android:taskAffinity 当我们的初始加载WelcomeActivity界面—>HomeActivity界面时,如果将HomeActivity的启动模式设置为sigleTask+android:taskAffinity=”自定义 在这里,需要强调一下singleTask+android:taskAffinity不一定必须使用,请依据需求而定,网上有人推荐使用,但我却想说,不要盲目,并不是所有的应用都适合。 1–> singleTask+android:taskAffinity对于效率而言,优势并不存在,比如设置进程的,但对于带有登录状态的app需要慎用,否则造成信息泄露等问题,开发中只使用singleTask 2–> singleTask+android:taskAffinity适用于单用户保密性的app(可做到Home之后下次必须登录才能查看信息),建议在这方面试试。
在官方文档中可以得到关于taskAffinity的以下信息: taskAffinity表示当前activity具有亲和力的一个任务(翻译不是很准确,原句为The task that the activity 我们可以通过设置不同的taskAffinity属性给应用中的activity分组,也可以把不同的应用中的activity的taskAffinity设置成相同的值。 这就可以解释上面示例中的现象了,由第5条可知,MainActivity和SecondActivity具有不同的taskAffinity,MainActivity的taskAffinity为com.jg.zhang.androidtasktest ,SecondActivity的taskAffinity为com.jg.zhang.androidtasktest.second,根据上面第4条,taskAffinity可以影响当 activity 以 上面讨论的是设置taskAffinity属性的情况,如果SecondActivity只设置启动模式为singleTask,而不设置taskAffinity,即三个Activity的taskAffinity
开发中常用的有 FragmentActivity 、ListActivity 15.什么是 ANR,如何避免 16.Android不同组件ANR超时时间不同 16.关于taskAffinity 单纯使用 taskAffinity 不能导致 Activity 被创建在新的任务栈中,需要配合 singleTask 或者 singleInstance! taskAffinity + allowTaskReparenting allowTaskReparenting 赋予 Activity 在各个 Task 中间转移的特性。 一个在后台任务栈中的 Activity A,当有其他任务进入前台,并且 taskAffinity 与 A 相同,则会自动将 A 添加到当前启动的任务栈中。 其中 FirstC 的 taskAffinity 为”lagou.affinity“,且 allowTaskReparenting 属性设置为true。
什么是 taskAffinity 属性 标识了一个 Activity 所需任务栈的名字,但不能根据这个名字来确定任务栈。因为你可以理解同样一个任务栈有多个名字。 可以单独指定每一个 Activity 的 taskAffinity 属性覆盖默认值 一个任务的 affinity 决定于这个任务的根 Activity 的 taskAffinity 在概念上,具有相同的 affinity 的 activity (设置了相同 taskAffinity 属性的 activity)属于同一个任务。 为一个 activity 的 taskAffinity 设置一个空字符串,表明这个 Activity 不属于任何 task taskAffinity 属性不对 standard 和 singleTop ="com.syd"/> 只是改变了 taskAffinity 的名字,但是任务栈依然还是启动这个 Activity 的 Activity 所在的任务栈。
补充说明: 在MainActivity启动时,系统自动创建了App的Task栈,并且taskAffinity默认为包名:com.test.haha。 以下为三种情况: 情况1:只在Activity添加FLAG_ACTIVITY_NEW_TASK 使用Task栈和MainActivity的Task栈是一样的,因为没有在AndroidMainfest添加taskAffinity ,那么taskAffinity的默认值为包名即com.test.haha。 情况2:只在AndroidMainfest添加taskAffinity 不添加flag,无效 情况3:同时在Activity添加FLAG_ACTIVITY_NEW_TASK 和 在AndroidMainfest 添加taskAffinity(若指定为包名,则转到情况1) 则创建新的Task栈,行为同启动模式singleTask。
taskAffinity 那既然它还活着,为什么会被藏起来呢?因为它们的 taskAffinity 冲突了。 在 Android 里,一个 App 默认只能有一个 Task 显示在最近任务列表里。 它的值默认取自它所在的 Application 的 taskAffinity,而 Application 的 taskAffinity 默认是 App 的包名。 另外,每个 Task 也都有它的 taskAffinity,它的值取自栈底 Activity 的 taskAffinity;我们可以通过 AndroidManifest.xml 来定制 taskAffinity 当我们启动一个新的 Task 的时候——比如开机后初次点开一个 App——这个 Task 也会得到一个 taskAffinity,它的值就是它所启动的第一个 Activity 的 taskAffinity 而且如果这个独立设置的 taskAffinity 恰好和另一个 App 的 taskAffinity 一样,这个 Activity 还会直接进入别人的 Task 去。