Activity的launchMode和taskAffinity介绍

我们都知道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传入数据,反之则新建.

发布了46 篇原创文章 · 获赞 25 · 访问量 16万+

猜你喜欢

转载自blog.csdn.net/zhejiang9/article/details/61199005