Activity 启动模式之SingleTask

当我们在AndroidManifest.xml文件中声明Activity的launchMode为singleTask时,按照官方的文档,

系统会创建新任务,并实例化新任务的根 Activity。但是,如果另外的任务中已存在该 Activity 的实例,则系统会通过调用其 `onNewIntent()` 方法将 intent 转送到该现有实例,而不是创建新实例。Activity 一次只能有一个实例存在。

如果另外的任务中已存在该 Activity 的实例,则系统会通过调用其 `onNewIntent()` 方法将 intent 转送到该现有实例,而不是创建新实例

这句话该如何理解呢?系统又怎么判定该任务中是否已存在该 Activity 的实例呢?

系统在启动singleTask 标识的activity对象时,会判定该activity对象的taskAffinity属性是否声明,没有声明的话默认就是该应用的ApplicationID。所以当别的页面启动该Activity时,如果没有指明taskAffinity,则系统会判定当前页面的taskAffinity为ApplicationID,此时如果存在一个相同taskAffinity的任务栈,则系统会将该Activity放置在该任务栈中,假如该Activity launchMode声明为singleTask。但是如果该页面声明了taskAffinity且不与该应用的ApplicationID不一致,则系统会新建一个task存放该Activity。

结论如下

1:一个APP启动时创建的taskAffinity是跟build.gradle里的applicationID保持一致的,如果Launcher页面没有设置taskAffinity的话

一旦Launcher也设置了taskAffinity话,系统会创建一个新的任务栈存放Launcher页面。因为系统启动Launcher页面时自动给其添加了SingleTask标识

2:单纯设置Activity的taskAffinity属性是不生效的,该属性必须配合singleTask launchMode使用。单纯使用singleTask launchMode也不能保证将该页面存放在一个新的任务栈中,除非当前系统中不存在与该页面taskAffinity一致的任务栈,此时系统才会创建新的任务栈


philadelphia
17 声望4 粉丝

雪山千古冷,独照峨眉峰