Android 中的 android:launchMode
决定了 Activity
在启动时如何在任务栏中管理它的存在方式。下面我们来结合 Task Stack 管理详细解释。
1. android:launchMode
的四种模式
1.1 standard (标准模式, 默认)
- 启动方式:每次启动都会创建一个新实例并压入栏任务堆中。
- 应用场景:适用于需要多个实例的场景,比如详情页。
- 示例配置:
<activity android:name=".StandardActivity"android:launchMode="standard"/>
1.2 singleTop (堆顶复用模式)
- 启动方式:如果标的
Activity
已经在栏顶,则会复用它并调用onNewIntent()
;否则依然创建新实例。 - 应用场景:适用于消息推送页面、搜索页面。
- 示例配置:
<activity android:name=".SingleTopActivity"android:launchMode="singleTop"/>
1.3 singleTask (堆内复用模式)
- 启动方式:如果任务栏中已经存在该
Activity
,则复用它并清除其上的Activity
;否则创建新实例。 - 应用场景:适用于 App 主页面。
- 示例配置:
<activity android:name=".SingleTaskActivity"android:launchMode="singleTask"/>
1.4 singleInstance (全局单例模式)
- 启动方式:每次都在单独的任务栏中启动,全局仅一个实例。
- 应用场景:适用于蓝牙配对界面、视频播放器。
- 示例配置:
<activity android:name=".SingleInstanceActivity"android:launchMode="singleInstance"/>
2. Android 如何管理 Task Stack
在 Android 中,任务栈(Task Stack)的管理主要由 ActivityManagerService(AMS) 和 TaskSupervisor 负责,具体来说:
2.1 ActivityManagerService(AMS)
AMS
是 Android 系统的 核心服务,负责管理Activity
的生命周期、任务栈以及进程调度。- 当
Activity
启动或销毁时,AMS
会根据launchMode
和Intent
Flags 决定Activity
是否应该创建新的实例,还是复用已有的Activity
。 - 主要职责:
- 维护任务栈(
Task Stack
) - 处理
Activity
的启动/切换/销毁 - 进行进程管理和调度
- 维护任务栈(
2.2 TaskSupervisor
TaskSupervisor
是AMS
内部的一个类,专门用于管理任务栈(Task
)。TaskSupervisor
主要负责:- 创建/删除任务栈(
Task
) - 管理任务栈的切换
- 根据
launchMode
规则调整Activity
的位置 - 清除特定
Activity
之上的Activity
(如singleTask
)
- 创建/删除任务栈(
2.3 ActivityStack
ActivityStack
代表一个 任务栈,它包含一组ActivityRecord
(即Activity
的实例信息)。AMS
通过ActivityStack
来管理Activity
的启动、暂停、恢复等操作。
任务栈管理流程
当一个 Activity
启动时,AMS
主要执行以下操作:
-
应用请求启动
Activity
:- 通过
startActivity(Intent)
发送启动请求。 - 由
ActivityTaskManagerService
处理该请求。
- 通过
-
判断
launchMode
:- 如果是
standard
,总是创建新实例。 - 如果是
singleTop
,检查栈顶Activity
是否是相同实例,若相同则复用。 - 如果是
singleTask
,查找任务栈内是否已有实例,若有则复用并清除其上的Activity
。 - 如果是
singleInstance
,则启动Activity
并创建独立任务栈。
- 如果是
-
通知
TaskSupervisor
处理任务栈调整:- 可能涉及
ActivityStack
切换、Activity
回收等操作。
- 可能涉及
-
最终交给
ActivityThread
处理 UI:AMS
通过Binder
进程间通信(IPC)通知ActivityThread
在目标App
进程中创建Activity
实例,并回调onCreate()
。
示例分析
假设你启动了 MainActivity
(singleTask
):
val intent = Intent(this, MainActivity::class.java)
startActivity(intent)
如果任务栈中已有 MainActivity
:
AMS
发现MainActivity
在栈中,调用onNewIntent()
并清除它上面的Activity
。
如果任务栈中没有 MainActivity
:
AMS
创建MainActivity
实例,并将其加入任务栈。
总结
组件 | 作用 |
---|---|
ActivityManagerService (AMS) | 负责管理 Activity 生命周期、进程和任务栈 |
TaskSupervisor | 负责创建/销毁 Task ,维护 Activity 之间的关系 |
ActivityStack | 代表一个 Task ,存放 ActivityRecord |
ActivityThread | 运行在 App 进程中,负责 Activity 的创建、UI 渲染 |