taskAffiny是用来指定activity的task名字,即activity被放到名字为taskAffiny属性设定的任务栈task中。如果activity没有设置taskAffiny,则使用application的taskAffiny属性,如果application也没设置taskAffiny,则使用当前包名作为task的名字。
给activity指定了taskAffiny属性,但该属性不一定生效,只有在以下情况下taskAffiny才会生效:
1. activity的启动模式为singTask或者singleInstance;
2. 启动该activity的上一个activity的启动模式是singleInstance;
这2种情况下回将该activity放到taskAffiny指定的task中,如果当前没有该task就新建一个。
其他情况下即使设置了taskAffiny属性,依然也是无效的,activity会进入到和启动它的activity相同的task。
还有一种情况,有A和B这2个activity,taskAffiny都是一样的,A的启动模式为singleInstance,A启动B。按理说A和B应该在同一个task中,但是A的启动模式决定它应该独占一个task,所以B的task不是A的task,是一个新的task,只是该task的名字和A的相同而已。即名字相同的task不一定是一个,如A启动B,B的启动模式为singleInstance,且没有设置taskAffiny,那么B的task名字和A的一样,但确是另外一个。
还有一种情况,应用A和应用B,他们的主activity分别是A1和B1,现在A1、B1的taskAffiny相同,那么如果应用A先打开,回到桌面,打开应用B,此时会进入到A的主activity A1;如果应用B先打开,回到桌面,打开应用A,此时会进入到B的主activity B1。
长按HOME键或者Navigation bar的recent key在最近应用程序列表中会显示最近访问过的应用,每个task都会以界面形式呈现在最近的应用列表中,如果想隐藏,则设置属性:
在主activity(也就是task的根activity)处设置属性:android:excludeFromRecents=“true”
。
查看task和activity的命令:
Adb shell dumpsys activity activities