[Android] LaunchMode 辨析

118 阅读3分钟

前言

Android启动模式有 standard, singleTop, singleTask, singleInstance这几种,各种启动模式的区别就在于 Activity入栈时各任务栈的交互以及栈内的行为,因此在介绍启动模式之前,先来了解什么是 Task和 BackStack:

1.Task & BackStack

我们在查看手机后台进程界面,排列的就是一个个 Task,每个 Task中将 Activity用栈的结构存储起来,称为 BackStack,也就是常说的任务栈或回退栈。当 Task位于前台时,此时与用户交互的就是栈顶的 Activity,按下返回键,栈中的 Activity一个个弹出,当最后一个 Activity弹出后,Application关闭,所在的 Task被销毁,但是我们仍能在查看后台进程的界面看到已经被清空的任务栈,这是因为虽然清空了 Task,但系统在查看后台进程界面留下了 App的入口,此时点进去相当于从桌面图标点进去,重启了这个 App。

2.各种启动模式

2.1 standard 标准模式

这是 Activity的默认启动模式,就是在一个任务栈里,将被启动的 Activity加入到启动它的 Activity所属的任务栈中。

2.2 singleTop 栈顶复用

这个模式与 standard几乎一样,唯一的区别是当在一个前台任务栈中,新启动的 Activity如果刚好与栈顶的 Activity相同时,会直接复用当前栈顶 Activity,而在 standard中,每新启动一个 Activity,都会直接在新建一个 Activity入栈,但如果新启动的 Activity与栈顶 Activity不同,仍能多次实例化,因此 standard与 singleTop可以分为一类,他们都可以简单的做到多次实例化,但是下面几种模式下, Activity要创建多个实例就有条件限制。

2.3 singleTask 栈内复用

在此模式下,当新启动的 Activity已经在当前栈或其他栈有实例时,会直接复用已有的 Activity实例,并且把该实例上所有的 Activity全部出栈,以此让该实例位于栈顶,如果当前栈或其他栈没有实例,则在当前栈顶新建。

2.4 signleInstance 全局单例

这个模式与 signleTop类似,不过他有一个更严格的限制,即一个 Task中只保留一个 Activity,也就是当启动 Activity时,会新建一个 Task并且新启的 Activity入栈,如果该 Activity已有实例,则复用。一般情况下用不到这种模式。

3.在一个 App中启动另一个 App的 Activity时,各任务栈的交互及栈内的行为

3.1 standard模式下 App中的 Activity被其他 App启动

假设:App1: 各种模式, App2: standard
App1中启动 App2中的某个 Activity,新启的 Activity直接加在 App1任务栈顶,此时开启 App2,与位于 App1任务栈中的 Activity互不干扰。

3.2 singleTask模式下 App中的 Activity被其他 App启动

假设:App1: 各种模式, App2: singleTask
App1中启动 App2中的某个 Activity,如果该 Activity已有实例,则直接将 App2任务栈中该 Activity置为栈顶,并且将 App2任务栈压在 App1任务栈上(此处引入一个新概念:任务栈也是能叠加的,当且仅当该栈为前台栈,一旦切入后台(查看后台,点 home键回主页等),就会被拆开),此时当我们相当于进入了 App2,点击返回键并不会直接回到 App1,只有当 App2任务栈中的所有 Activity销毁才会回到 App1。

3.3 singleInstance模式下 App中的 Activity被其他 App启动

假设:App1: 各种模式, App2: singleInstance
App2中的 Activity被启动,每次都新建一个 Task存储新启的 Activity,并将新建的任务栈叠加在当前任务栈顶。

end --- 更详细的内容可以看此视频,视频中有更直观的动画演示