关于singleTask (LaunchMode随笔)

Posted Blue Vienna

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于singleTask (LaunchMode随笔)相关的知识,希望对你有一定的参考价值。

今天,居然被问起关于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的习惯养成。
 
 
 

以上是关于关于singleTask (LaunchMode随笔)的主要内容,如果未能解决你的问题,请参考以下文章

launchMode="singleTask" 不创建新任务

设置 launchMode="singleTask" 与设置活动 launchMode="singleTop"

launchMode 为 singleTask 的 Activity 的两个实例

Activity 为 launchMode="SingleTask" 时,进度对话框未显示 2 次

launchmode =“singletask”的xml等效标志

始终重新创建具有 launchMode singleTop 或 singleTask 的 Activity