Task Affinity
- 我们都比较熟悉Activity的launch mode,但是很多人并不知道TaskAffinity这个属性,这个属性可以在AndroidManifest里面的activity配置:android:taskAffinity
Task
- 一个Task就好像它的名字一样,是一个任务,Android上把一个任务抽象成一系列的UI(Activity)去完成,比如默认情况下一个App就是一个task,一个task把UI逻辑聚合起来,一个task中的Activity在逻辑上应该是完成同一个方法的
- 在最简单的情况下,Android设备上的每一个App都至少对应一个Task,所以分前台Task和后台Task
- 每一个Task都是一个栈的结构
Affinity
- 其实我认为TaskAffinity更应该理解为Task的名字,默认不设置的时候Activity的TaskAffinity是你的包名,也就是说默认情况下,app里所有的actvity都放在名为<package-name>的Task里面
- 不同的TaskAffinity理应放在不同的Task中,但是其实会有多种情况:
- 当一个Activity有singleTask/FLAG_ACTIVITY_NEW_TASK时,会先去寻找当前的task中有没有affinity是和该activity一样的,如果有没有就会重建一个Task,如果有就会去找task里面有没有对应的实例,如果有销毁该Activity上面的Activity,否则就直接压入栈
- 如果一个Activity有TaskAffinity但是没有singleTask/FLAG_ACTIVITY_NEW_TASK时,那TaskAffinity无效
- 如果一个Activity没有singleTask/FLAG_ACTIVITY_NEW_TASK,那么启动它后它会存在于启动它的那个Task内(如果允许的话)
- 如果launch mode是single instance,那创建这个activity时无论它的Affinity是什么都会创建一个新的Task,而且这个Task不允许有其他Activity
表现
- Android操作系统有三个键,一个Home,一个Back,还有一个查看app的按键(部分Rom可能改动了),查看app其实查看的是task,即同一个application有两个task,那点击查看app页面的按键也会显示两个
- 如果一个Activity是singleInstance启动,那在点击查看运行app键时并不会显示这个只能存放一个Activity的Task,它被认为是启动它的那个Task的一部分
- 例:在自己的App中启动微信的Activity且不设置FLAG_ACTIVITY_NEW_TASK,那这个微信的Activity会存在于自己app的Task中,而且查看当前app时这个Activity也显示在自己的App中
网友评论