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,它在任务栈管理上提供了更高的自由度。