Activity 做为 Android 四大组件之一,几乎是被接触得最多的。Activity 中有个启动模式的概念,分别是 standard
、singleTop
、singleTask
以及 singleinstance
,这篇文章总结一下这四种启动模式的特色。html
当咱们打开一个 APP,第一个出现的 Activity 是咱们指定的默认 Activity,经过这个 Activity 能够跳转到其它 Activity,按返回键能够依次返回到上一个 Activity。这是由于系统把咱们打开的 Activity 放在一个任务栈中。打开第一个 Activity 时,系统会新建一个任务栈,若是继续打开新的 Activity,会建立新 Activity 的实例而且放到任务栈的栈顶,返回时将栈顶的 Activity 出栈,新的栈顶 Activity 将呈如今界面上,过程以下图。android
这是默认状况下的任务的入栈出栈,若是指定了不一样的启动模式将会有不一样的表现。ide
standard
是标准启动模式,当咱们没有指定 Activity 的启动模式时,默认就是这种模式。在 standard
模式下,每次启动一个 Activity 都会建立一个新的实例,它的 onCreate
、onStart
以及 onResume
均会被调用。这个新建立的 Activity将会放在启动它的 Activity 所在的任务栈的栈顶。ui
standard
模式),那么 B 将会进入 A 所在的栈 S。standard
模式的 Activity,好比在 Service 中,此时新的 Activity 没有任务栈可入,会出现异常:此时应该为这个 Activity 指定 FLAG_ACTIVITY_NEW_TASK
,这样就会新建一个任务栈。this
singleTop
是栈顶复用模式。在这种模式下,若是新启动的 Activity 已经在任务栈的栈顶了,那么就不会从新建立新的实例,而是调用这个 Activity 的 onPause
、onNewIntent
以及 onResume
方法。若是新启动的 Activity 不是位于栈顶,那么仍是会从新建立。spa
singleTop
,那么不会再次建立 D 的实例,栈内依然是 ABCD。standard
启动模式,那么栈内将变为 ABCDD。singleTask
是栈内复用模式。这是最复杂的一种模式,由于它可能涉及到多个栈。当一个具备 singleTask
模式的 Activity 启动后,好比 Activity A,系统会首先寻找是否存在所需的任务栈,若是不存在,就从新建立一个任务栈,而后建立 A 的实例后把 A 放入到栈中。若是存在 A 所须要的任务栈,这时要看 A 是否在栈中有实例存在,若是有,那么系统就会把它调到栈顶而且调用它的 onNewIntent
方法,若是不存在,就建立 A 的实例并把 A 压入栈中。这里所说的 A 所须要的任务栈是什么意思呢?其实 Activity 是能够指定本身想要的任务栈的名字的,经过一个参数:TaskAffinity
,默认状况下,全部的 Activity 所须要的任务栈的名字为应用的包名。3d
singleTask
模式请求启动,它须要的任务栈为 S2,因为 S2 和 D 的实例均不存在,因此系统就会先建立任务栈 S2,而后在建立 D 的实例并将其入栈到 S2onNewIntent
方法。那 B 和 C 怎么办? 它们会所有出栈,至关于 clearTop 效果。singleInstance
是单实例模式。这种模式是 singleTask
的增强版,它除了具备 singleTask
的全部特性外,还增强了一点,那就是此种模式的 Activity 只能单独位于一个任务栈中。code
singleInstance
模式,当 A 启动后,系统会建立一个新的任务栈,而后 A 独自在这个新的任务栈中,因为栈内复用的特性,后续的请求均不会建立新的 Activity,除非这个栈被销毁了。Activity 的四种启动模式就是这样,除了 singleTask
稍微有点复杂,其它都很好理解。有的时候会出现多个任务栈的状况,好比如今有两个任务栈(以下图),前台的任务栈状况为 Activity1 和 Activity2, 然后台任务栈的状况为 ActivityX 和 ActivityY,假设 XY 的启动模式均为 singleTAsk。如今启动Y, 那么整个后台任务栈都被切换到前台,这时候的后退列表变为 12XY。当按返回键的时候,Activity 会依次出栈。component
参考htm
若是个人文章对您有帮助,不妨点个赞鼓励一下(^_^)