今天,居然被问起关于singleTask的问题,问题如下:
“现在Activity栈里有4个Activity,从栈底到栈顶分别是A->B->C->D,现在从Activity D启动Activity B,问此时的栈情况。”
我居然忘了,只是记得有singleTask/singleTop/singleInstance,又还记得有一个是会把他上面的Activity全部Pop出,自己回到栈顶(殊不知这个现象就是问题的答案),从现象和字面上看来好像是singleTop。
回来之后怒查Google,并写了个小程序实践了下,增强印象,并决定写下Blog以便以后回顾。
现在我们先来复习下,singleTask和singleTop分别是什么样的行为。
> LaunchMode为singleTop
其实singleTop很简单,就是当且仅当Activity在栈顶的时候才会复用(意思就是栈顶绝不会有连续两个该Activity),当Activity不在栈顶的时候都会重新创建的。
同学们可能会纳闷,都在顶部那有什么卵用啊,栈顶不就代表着是手机显示的Activity吗?不是的,其实Android系统中有很多的Task栈的,同个栈里的Activity都是一个Task(Task是个复杂的概念,具体的概念请看官方文档,你可以简单理解为一个任务场景)。
比如:
TaskA:
(栈底)ActivityA1 -> ActivityA2 (singleTop)
TaskB:
(栈底)ActivityB1 -> ActivityB2(启动ActivityA2)
目前界面为ActivityB2,ActivityB2启动ActivityA2,那当前栈会切换到TaskA,连续按返回键的Activity顺序为:
ActivityA2 -> ActivityA1 -> ActivityB2 -> ActivityB1
看到区别了吧。
> LaunchMode为singleTask
只要Activity存在栈中,都会被复用,但是会直接把Activity推到栈顶(也就是会把Activity到栈顶的其他Activity全部出栈)。
比如:
TaskA:
(栈底)ActivityA1 -> ActivityA2 (singleTask)-> ActivityA3
TaskB:
(栈底)ActivityB1 -> ActivityB2(启动ActivityA2)
目前界面为ActivityB2,ActivityB2启动ActivityA2,那当前栈会切换到TaskA,连续按返回键的Activity顺序为:
ActivityA2 -> ActivityA1 -> ActivityB2 -> ActivityB1
ActivityA3不见了,A3在B2启动A2的时候就被出栈销毁了。
> LaunchMode为singleInstance
这个更简单,就是我只想一个人静静地。自己一个人独占一个栈,不会包含其他的Activity。
简单吧,这样LaunchMode就都讲明白了。
最后说下怎么启动一个新的Activity栈,难道非要建多个App(好麻烦啊)?
其实是不用的。
我们在AndroidManifest.xml中声明Activity的时候,有一个taskAffinity参数的(如果没有显示声明,则默认继承于Application,Application没声明则默认为AppId[包名])。
通过声明taskAffinity和Intent.FLAG_ACTIVITY_NEW_TASK可以把该Activity创建在新栈。
注:taskAffinity需要和包名一样的格式。
写在最后
没有图片比较简单,但我会继续加油优化的,先把写Blog的习惯养成。