一篇文章搞懂 Activity 启动模式

本文大部分翻译自 《Android “launchMode” (Visualized)》, 并结合本身的理解在 SingleInstance 中添加了补充内容html

启动模式 是很重要的一块知识点,每位安卓开发都应该了解它是如何运做的。大部分的开发者(包括我本身)认为咱们已经知道了如何来使用 启动模式。可是其实咱们错了。不单单是知道将 Activity 设置为 SingleTask 来防止重复实例化就足够了,虽然大部分状况下这已经解决了咱们的业务需求。可是咱们真的了解当咱们将一个 Activity 设置为 SingleTask 时,它是如何影响 Activity 任务栈内其余 Activites 的吗?android

本文将图文的模式来说解 4 中启动模式的做用及区别。首先须要来说解如下图片的做用来帮助你更容易理解下面的内容ide

绿色表明在 Activity 任务栈中建立了一个新的 Activity 实例
黄色则表明复用了以前建立的 Activity 实例,可是该 Activity 的 onNewIntent() 方法将会被调用ui

Standard 启动模式讲解

若是在 AndroidManifest.xml 中将 Activity B 的启动模式设置为 Standard,无论任务栈内是否已经存在 Activity B 的实例,当启动 Activity B 时,都会建立一个崭新的 Activity B 位于任务栈顶翻译

SingleTask 模式讲解

若是在 AndroidManifest.xml 中将 Activity C 的启动模式设置为 SingleTask,若是此时任务栈内已经存在 Activity C 的实例且未位于栈顶,当启动 Activity C 时,会将 Activity C 上方的实例所有出栈让其位于任务栈顶并 Activity C 中的 onNewIntent() 方法会被调用3d

若是在 AndroidManifest.xml 中将 Activity C 的启动模式设置为 SingleTask,而且此时任务栈内并不存在 Activity C 的实例,当启动 Activity C 时,会建立一个崭新的 Activity C 实例在栈顶code

SingleTop 启动模式讲解

若是在 AndroidManifest.xml 中将 Activity D 的启动模式设置为 SingleTop 而且任务栈内存在 Activity D 实例且位于栈顶时,当启动 Activity D 时,会复用以前建立的 Activity D 的实例,而且 onNewIntent() 方法被调用cdn

若是在 AndroidManifest.xml 中将 Activity D 的启动模式设置为 SingleTop 而且任务栈内并不存在 Activity D 的实例时,当启动 Activity D 时,会建立一个崭新的 Activity D 实例在栈顶xml

若是在 AndroidManifest.xml 中将 Activity D 的启动模式设置为 SingleTop 而且任务栈内存在 Activity D 的实例但其实例未在栈顶时,当启动 Activity D 时,会再次建立一个崭新的 Activity D 实例在栈顶htm

SingleInstance 模式讲解

若是在 AndroidManifest.xml 中将 Activity E 的启动模式设置为 SingleInstance,而且任务栈内不存在 Activity E 的实例,当启动 Activity E 时,会在建立一个新的任务栈,而且栈内只有 Activity E 一个实例

若是此时基于上面的任务栈,从 Activity D 中开启一个启动模式为 Standard 的 Activity F,那任务栈会发生什么样的变化呢?请看下图

此时 Activity E 依旧会独立的存在于本身的任务栈中,而新建立的 Activity F 将会和 Activity D 位于相同的任务栈的栈顶

若是启动模式为 SingleInstance 的 Activity E 已经独立存在于本身的任务栈中,此时再启动 Activity E, 则会复用已经建立的 Activity E 的实例,而且 Activity E 的 onNewIntent() 方法被调用

若是基于上面的任务栈,从 Activity E 中开启一个启动模式为 Standard 的 Activity F,那任务栈会发什么样的变化呢,请看下图

由于 singleInstance 的属性是禁止与其余 Activities 共享任务栈,因此启动模式为 SingleInstance 的 Activity 启动其余 Activity 时会默认带有 FLAG_ACTIVITY_NEW_TASK 属性。因此 Activity E 启动 Activity F 后,最后会存在三个任务栈,Activity F 会单独存在于一个任务栈中

参考

相关文章
相关标签/搜索