Activity启动模式详解

1.简介

安卓四大组件之一Activity有5种启动模式,分别为:

1.standard 标准模式,每次都会重新创建一个实例对象;

2.singleTop 如果在任务栈顶发现了相同的实例则重用,否则新建并压入栈顶;

3.singleTask 如果在任务栈中发现了相同的实例,将其上面的所有任务终止并移除,重用该实例。否则新建实例并入栈;

4.singleInstance 允许不同应用,进程线程等共用一个实例,无论从何应用调用该实例都重用,独占一个栈;

5.singleInstancePerTask 可以避免在同一个任务栈中创建多个实例,但允许在不同的任务栈中有多个实例;

通过以上简要的描述可以对启动码有个基础的了解,下面就根据没一个进行详细介绍。拭目以待!

2.详述

2.1. standard 模式



standard(标准模式)是Activity默认的启动模式,即当前Activity未显式设置启动模式情况下,其启动模式为standard。在standard模式下,每次启动该Activity系统都会创建一个新的实例(instance)并压入当前任务栈顶,不论是否已有相同Activity实例存在。Activity实例数量没有限制,具体取决于任务栈深度。

该模式适用于大多数情景

2.2. singleTop 模式

2.2.1 Activity栈


当Activity启动模式设置为singleTop时,系统启动该Activity时若发现当前任务栈栈顶(并非系统全局)为该Activity实例,则会直接复用该实例(调用onNewIntent()方法)而不会重新创建;若当前任务栈栈顶不为该Activity实例时,则会创建新的实例无论当前或其他任务栈中是否已存在对应实例。

该模式适用于在同一任务中频繁跳转回当前页面的场景。

2.2.2 重复启动TopActivity时生命周期

当已存在TopActivity在栈顶时,此时如果再次跳转至TopActivity则不会重新创建新的Activity,只会调用onNewIntent()重新将栈顶的TopActivity

2.3. singleTask 模式


当Activity启动模式设置为singleTask时,系统启动该Activity时若发现存在一个任务栈(系统全局)中存在该Activity实例时,则会直接复用该实例(调用onNewIntent()方法)而不会重新创建,同时将该任务栈中位于该实例之上的其它Activity实例都将会被弹出栈,该实例作为当前任务栈栈顶;若所有任务栈中都不存在该Activity实例时,则会在当前任务栈中创建该Activity实例作为栈顶。该实例在所有任务栈中唯一存在。

该模式适用于“主页”类Activity,或者需要保证该Activity在整个应用中只有一个实例的场景。

2.4. singleInstance 模式


当Activity启动模式设置为singleInstance时,系统全局只允许存在该Activity的一个实例,并且该Activity将独占一个任务栈。系统启动该Activity时,若所有任务栈中都不存在该Activity实例时,系统会使用一个独立的任务栈,并在该栈中创建该Activity实例,该任务栈只用于管理该Activity实例,唯一存在;当该Activity实例已经存在于独立的任务栈中时,系统会直接复用该实例,该实例在所有任务栈中唯一存在。

该模式适用于锁屏页面、视频播放等需要独立管理的Activity,防止干扰。

2.5. singleInstancePerTask 模式

这是Android API 31(即 Android 12)引入的一种新的启动模式。这种模式可以看作是对 singleInstance 和 singleTask 启动模式的一种补充,目的是增强应用在多任务场景中的灵活性。当Activity启动模式设置为singleInstancePerTask时,系统启动该Activity时若发现当前任务栈中存在该Activity实例时,则会直接复用该实例;若不存在,则在当前任务栈中创建新的实例作为栈顶。

该模式适用于需要跨多个任务栈独立运行,但每个任务栈中只允许一个实例的 Activity,如多窗口操作中,每个窗口都需要独立的 Activity 实例。

3.其他

Android中查看Activity任务栈方法

adb shell dumpsys activity activities -p 包名 >本地日子文件目录,如:

adb shell dumpsys activity activities -p com.aphrodite.algorithmdemo >D:\log_202502282256.tx

4.总结

singleInstancePerTask 作为 Android 12 新增的启动模式,提供了灵活的任务栈管理方式,适用于需要在不同任务栈中复用 Activity 的场景。相较于 singleTask 和 singleInstance,它在任务栈管理上提供了更高的自由度。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容