先来贴一下官方介绍的截图:
英文版:
以下是中文版:
看完文档之后相信大家对standard和singleTop的理解应该不会有太大问题,但是singleTask和singleInstance可能就仁者见仁智者见智了,先来看一下singleTask这个介绍,尤其是第一句“系统会创建新任务,并实例化新任务的根 Activity”,英文版“The system creates a new task and instantiates the activity at the root of the new task.”,结合后边所说,这意思不就是如果不存在该设置singleTask的Activity,系统会创建一个新的栈并且会创建一个Activity实例吗,也就是说每次发现这个实例不存在就会创建新的task栈,有人肯定说了“系统不会创建新栈来存放该Activity”。经我测试发现真就还真如所说。难道官方文档是说错了?😄
先来说下结论:
在不存在Activity的实例时,系统的确会创建一个新的栈来存放Activity,只不过那要看具体的情况,这就涉及到 taskAffinity(亲和力)这个属性了,在不设置这个属性的情况下,activity是和application具有相同的亲和力的,在创建singleTask的activity时,如果有相同亲和力的栈(task)已经存在了那么此时系统是不会创建新的栈的,但是如果不存在的话,就会创建新的栈。
为什么我们看到的情况是没有见过创建新栈呢?因为我们一般不会去给activity去设置taskAffinity这个属性,你所设置singleTask的activity在没设置taskAffinity的情况下,他的亲和力是和application一样的,当打开app时就已经创建了和application对应的亲和力的栈,所以打开singleTask的activity时就没有创建新的栈。
接下来进入实战环节,来验证上述所述:
上代码:
由MainActivity跳转SecondActivity,打印如下:
但是如果我给SecondActivity设置taskAffinity属性之后,如图:
打印如下:
也可以给MainActivity设置 taskAffinity属性,而不是给SecondActivity,如图:
打印如下:
那有人可能会说,不设置singleTask设置taskAffinity应该也会有这样的结果,上代码:
打印如下:
事实证明不是这样的,只有singleTask和singleInstance才会创建新栈,其实官方文档说的也很清楚,standard和singleTop都是在调用者栈中启动的activity
好了,看了上边的代码和结论,接下来说一下singleInstance,官方文档说它和singleTask相似,只是不同的一点是设置singleInstance的Activity所在的栈,只会有它自己,按照我们已经理解的知识,可以下个结论,启动它时肯定是会创建新的栈,没错,而且不需要设置taskAffinity,看代码:
打印如下:
打完收工!