我们都知道Android对Activity是通过分组来管理的,也就是说,每一个Activity都会存在于某一个分组,即Task内
系统在启动Activity的时候,需要根据Activity的相关配置参数来决定将Activity置放于哪个Task中(CreateNew or Chose An Existing One)
本文只是做一些重点总结,详细的可阅读SDK文档
Launch Mode:
Activity有一个launchMode属性用以配置其启动类型,主要包含如下四个类型
"standard" (默认)
在默认情况下,调用者只要申请创建Activity,它就会被创建并放置到调用者的Task顶端,多次申请,会被多次创建
"singleTop"
这个指的是,在调用者所属Task如果未包含Activity对应的实例或者包含但是不在栈顶,则会新创建一个实例并放置到Task顶端
"singleTask"
从名字就可以看出,指定这个launchMode的Activity在任何Task内只允许存在一个实例,拥有standard和singleTop的activity允许添加到该activity上,但是当该task进入后台后,下次再启动该activity,系统会将该Activity之上的Activity全部清除;注意singleTask的Activity不一定是所属Task的root activity
"singleInstance"
跟singleTask一样,也是创建唯一的task并启动Activity作为root节点,不同点在于,其不允许添加任何其他activity到task
既然Activity是一个独立的个体,它必须要归属于某一个Task,那系统在初始化Activity的时候,必须要确认每个Activity是属于哪个Task的,这就需要在Activity中定义一个属性来表明Activity所属的Task,这个属性就是TaskAffnity.
TaskAffnity:
TaskAffnity用来描述Activity的所属Task,对于同一个App内的Activity来说,如果没设置的话,其默认值就是App的package name,也就是说,在默认情况下,所有Activity是属于同一个Task的,当然我们也可以手动为Activity自定义TaskAffnity:
<activity android:name=".demo.DemoActivity" android:label="@string/app_name" android:taskAffinity="com.test.harish"/> |
singleInstance没什么好说的,系统会为其建立一个单独的Task,所以对它来说TaskAffnity无所谓了
至于standard和singleTop,由于其所属Task是由其调用者来决定的,所以在一般情况下,TaskAffnity对这两种类型是不起作用的,不过有一种特殊情况,就是调用者的类型是singleInstance时,这就导致调用者所属的Task不允许添加Activity,在这时候,系统没招了,只能通过其TaskAffnity新建或者找到已有的Task,然后将Activity添加到其中
singleTask就是比较正常的操作了,当启动Activity的类型是singleTask时,系统会通过TaskAffnity新建或者找到已有的Task,接着判断Task中是否存在该Activity实例,如果存在,调用OnNewIntent传入数据,反之则新建.