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 渲染 |