05
2017
10

Activity的四种启动模式讲解

首先说一下Activity为什么需要启动模式。我们知道,在默认情况下,当我们多次启动同一个Activity的时候,系统会创建多个实例并把它们一一放入任务栈中,当我们按BACK键时,会发现这些Activity会一一回退。任务栈是一种“后进先出”的栈结构,这个较好理解,每按一下Back键就会有一个Activity出栈,直到栈为空为止,当栈中无任何Activity时,系统就会自动回收这个任务栈。知道了Activity的默认启动模式后,我们就可能会发现,系统重复创建多个实例,这样不是很傻吗?这样的确有点傻,Android在设计的时候不可能不考虑这个问题,所以它就提供了四中启动模式供我们选择:standard、singleTop、singleTask和SingleInstance。下面我们就稍微讲解一下Activity的四中启动模式和它们的实用场景


Standard模式

      最常用的启动模式,也是Activity默认的启动模式,即不用编写配置。在该模式下,我们启动的Activity以栈的形式存储在某一个空间。在该模式下创建的实例可以有多个相同,也允许多个Activity叠加~
      假设有两个Activity,ActivityA和ActivityB,A有启动B的按钮,B也有启动A的按钮,它们之间的意图跳转具有栈的特性,也就是先进后出。在ActivityA中点击启动B后,然后在ActivityB中启动A,如此反复可以创建多个A和B的实例。
      应用场景:大多数情况


SingleTop模式

假设ActivityA和ActivityB都有启动自己和对方的按钮,我们可以这样尝试:
      A –> B –> A –> A(其中B为singleTop)
实际上是这样的顺序:
       A –> B –> A
在该模式,我们创建新的实例的时候,会去判断是否有相同的Activity在栈顶,如果有的话,就不会去创建新的实例,而是调用onNewIntent()方法
      另外,如果是交替启动Activity的话,顺序还是跟Standard模式一样:A –> B –> A –> B,只会判断栈顶是否与创建的实例相同,不同则创建新实例,在这一点上会是一样的
      应用场景:新闻类或者阅读类App的内容页面


SingleTask模式

假设有三个Activity:A、B、C(其中B设置为singleTask)
启动顺序如下:
A –> B –> C –> B –> C –> A –> B
分解一下:
操作:A –> B A –> B –> C       A –> B –> C –> B A –> B –> C –> B –> C –> A A –> B –> C –> B –> C –> A –> B
实际:A –> B A –> B –> C       A –> B                    A –> B –> C –> A                   A –> B
还有一个实例:
若是别的应用程序打开C2,则会新启一个task。
如别的应用Other中有一个activity,taskId为200,从它打开C2,则C2的taskIdI不会为200,例如C2的taskId为201,那么再从C2打开C1、C3,则C2、C3的taskId仍为201。
注意:如果此时你点击home,然后再打开Other,发现这时显示的肯定会是Other应用中的内容,而不会是我们应用中的C1 C2 C3中的其中一个。
(关于TASK和BACK STACK:Back Stack可以放多个Task,而每一个Task可以包含一个或多个Activity实例。 这里写图片描述
      应用场景:例如浏览器的主界面。不管从多少个应用启动浏览器,只会启动主界面一次,其余情况都会走onNewIntent,并且会清空主界面上面的其他页面。


SingleInstance模式

这个模式最复杂,需要用到上面的关于task和栈的相关概念
首先还是举个例子吧,同样把B启动模式设置为singleInstance
A –> B –> A,按一下BACK键,我们发现页面会跳到第一个,即A,再BACK一下才会跳到B,为什么呢?
这是因为B跳转到A的时候,我们的起点变成了B实例所在的栈结构,这样一来,我们需要“回归”到这个栈结构。而且我们手机显示的时候是从当前栈开始显示,释放也0从当前栈开始释放,这就导致了B所在栈会在最后一个被释放!
以下为图例:
这里写图片描述
这种模式有点特殊,因为他会启动一个新的栈结构,并把设置了singleInstance的Activity放里边儿,其他Activity都放在另外一个栈中,要把另外一个栈的Activity全部释放掉后才回到B中~
      应用场景:例如闹铃提醒,将闹铃提醒与闹铃设置分离。
这里写图片描述

singleInstance不要用于中间页面,如果用于中间页面,跳转会有问题,比如:A -> B (singleInstance) -> C,完全退出后,在此启动,首先打开的是B。

上一篇:【Android】の基础——ListView和RecyclerView缓存机制 下一篇:Android自定义View与添加点击事件