Android 中的 Activity 启动模式(Launch Mode)定义了当一个 Activity 被启动时,系统在任务栈中如何处理它的行为。
启动模式是任务栈中Activity的一种行为分类,在了解启动模式前,我们需要了解一下Activity的容器任务栈
1. 任务栈
-
任务栈 是一组按照用户启动顺序排列的 Activity 实例,遵循 原则。
-
每个任务栈通常代表一个用户正在执行的任务(Task)。
-
默认情况下,一个 App 只有一个任务栈,多个 Activity 按顺序压入其中。
总结
任务栈是Activity的容器
,遵循 后进先出(LIFO) 的原则,默认一个APP只有一个任务栈.开启一个Activity会放入对应的任务栈.
2.启动模式
Activity 的启动模式(Launch Mode)定义了当一个 Activity 被启动时,系统在任务栈中如何处理它的行为。
分类
- standard 标准模式
- singleTop 栈顶复用模式
- singleTask 栈内复用模式
- singleInstance 独立任务栈模式
2.1 standard(标准模式,默认)
- 每次启动此Activity 都会创建一个Activity对象 加入任务栈中
- 执行
onCreate()
等创建流程方法
ini
<activity android:name=".MyActivity"
android:launchMode="standard" />
特点:
- 每次
startActivity()
都会创建新实例。 - 最常见最常用。
2.2. singleTop(栈顶复用)
-
如果要启动的 Activity 正好在栈顶,不会新建实例,而是复用当前的实例。
-
否则与
standard
一样,创建新实例。
ini
<activity android:name=".MyActivity"
android:launchMode="singleTop" />
特点:
- 适合通知栏点击、Fragment 中多次点击避免重复启动页面。
- 若复用实例,
onNewIntent()
会被调用。
2.3 3. singleTask(栈内复用 + 清除上层)
-
系统查找是否存在该 Activity 的实例;
-
有:把它之上的所有 Activity 都销毁,它自己 复用 ,调用
onNewIntent()
。 -
无:创建新实例。
ini
<activity android:name=".MyActivity"
android:launchMode="singleTask" />
特点:
- 实例唯一,可跨栈复用(所在 task 内只保留一个)。
- 适合首页、聊天窗口、视频通话等"入口页"。
2.4. singleInstance(单独任务栈)
-
Activity 被放在 一个独立的任务栈中。
-
每次调用都是使用它独占的任务栈。
ini
<activity android:name=".MyActivity"
android:launchMode="singleInstance" />
特点:
- 所有调用该页面的应用或组件,都复用这个栈中的唯一实例。
- 非常规页面(如锁屏页、来电页、系统全屏弹窗)使用。
3.对比总结
模式 | 是否复用 | 是否独立任务栈 | 应用场景 |
---|---|---|---|
standard | ❌ 每次都新建 | ❌ | 默认,普通页面 |
singleTop | ✅ 栈顶复用 | ❌ | 防止重复点击跳转 |
singleTask | ✅ 栈内复用 + 清栈 | ❌ | 首页、统一入口页 |
singleInstance | ✅ 复用 | ✅ | 全局唯一页面(锁屏、来电) |
4.场景推荐总结
场景 | 推荐启动模式 |
---|---|
正常页面跳转 | standard (默认) |
连续点击防止重复 | singleTop |
回到主页/首页 | singleTask |
独立弹窗、锁屏、全屏页 | singleInst |
总结
Android Activity的四种启动模式是,针对Activity启动的不同场景,定义的页面在任务栈中的不同行为模式.所以在不同的业务需要求情况下,选用不同的任务栈,达到事半功倍的效果.