Android Activity 的 launchMode 與 Task Stack 管理

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 會根據 launchModeIntent Flags 決定 Activity 是否應該創建新的實例,還是復用已有的 Activity
  • 主要職責:
    • 維護任務棧(Task Stack
    • 處理 Activity 的啟動/切換/銷毀
    • 進行進程管理和調度

2.2 TaskSupervisor

  • TaskSupervisorAMS 內部的一個類,專門用于管理任務棧(Task)。
  • TaskSupervisor 主要負責:
    • 創建/刪除任務棧Task
    • 管理任務棧的切換
    • 根據 launchMode 規則調整 Activity 的位置
    • 清除特定 Activity 之上的 Activity(如 singleTask

2.3 ActivityStack

  • ActivityStack 代表一個 任務棧,它包含一組 ActivityRecord(即 Activity 的實例信息)。
  • AMS 通過 ActivityStack 來管理 Activity 的啟動、暫停、恢復等操作。

任務棧管理流程

當一個 Activity 啟動時,AMS 主要執行以下操作:

  1. 應用請求啟動 Activity

    • 通過 startActivity(Intent) 發送啟動請求。
    • ActivityTaskManagerService 處理該請求。
  2. 判斷 launchMode

    • 如果是 standard,總是創建新實例。
    • 如果是 singleTop,檢查棧頂 Activity 是否是相同實例,若相同則復用。
    • 如果是 singleTask,查找任務棧內是否已有實例,若有則復用并清除其上的 Activity
    • 如果是 singleInstance,則啟動 Activity 并創建獨立任務棧。
  3. 通知 TaskSupervisor 處理任務棧調整

    • 可能涉及 ActivityStack 切換、Activity 回收等操作。
  4. 最終交給 ActivityThread 處理 UI

    • AMS 通過 Binder 進程間通信(IPC)通知 ActivityThread 在目標 App 進程中創建 Activity 實例,并回調 onCreate()

示例分析

假設你啟動了 MainActivitysingleTask):

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/75114.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/75114.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/75114.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2025選擇手機之我見

自從開店之后&#xff0c;沒當有手機召開發布會&#xff0c;我就得去大概看看&#xff0c;了解一下屏幕&#xff0c;充電之類的東西。畢竟跟我的生意息息相關&#xff0c;而且還得研究要不要上新&#xff0c;從我目前賣貨的情況來看&#xff0c;折疊屏不是大眾的選擇&#xff0…

【區塊鏈安全 | 第九篇】基于Heimdall設計的智能合約反編譯項目

文章目錄 背景目的安裝1、安裝 Rust2、克隆 heimdall-dec3、編譯 heimdall-dec4、運行 heimdall-dec 使用說明1、訪問 Web 界面2、輸入合約信息3、查看反編譯結果 實戰演示1、解析普通合約2、解析代理合約 背景 在區塊鏈安全研究中&#xff0c;智能合約的審計和分析至關重要。…

利用 PCI-Express 交換機實現面向未來的推理服務器

在數據中心系統的歷史上&#xff0c;沒有比被 Nvidia 選為其 AI 系統的組件供應商更高的贊譽了。 這就是為什么新興的互連芯片制造商 Astera Labs 感到十分高興&#xff0c;因為該公司正在 PCI-Express 交換機、PCI-Express 重定時器和 CXL 內存控制器方面與 Broadcom 和 Marv…

智能交通預警桿:守護道路安全的科技先鋒

在城市化進程加速以及機動車保有量持續增長的背景下&#xff0c;道路交通安全與擁堵問題漸趨嚴峻。智能交通預警桿應時而生&#xff0c;其集成多種高科技功能&#xff0c;正逐步成為現代城市交通管理中至關重要的智能裝備&#xff0c;對于提升交通效率、保障出行安全發揮著關鍵…

flink 基站與服務器長連接,每次連接和斷開都會上報數據,統計過去一小時每個基站斷開次數和時長

模擬生成數據 CREATE TABLE ods_station_log (base_station_id int, -- 基站IDevent_type int, -- 事件類型: connect/disconnectevent_time TIMESTAMP_LTZ(3), -- 事件時間WATERMARK FOR event_time AS event_time - INTERVAL 5 SECOND -- 允許5秒亂序 ) WITH …

自定義一些C語言的字符串函數

一、代碼如下 (一)十六進制字符串轉十進制整數 #include<stdio.h> // 把一個十六進制字符轉成十進制整數 int hexToInt(char hexs[]){ int index; int k 0; for(k 0; ; k) { if(hexs[k] \0) { index k; break; …

核函數(機器學習深度學習)

一、核函數的基本概念 核函數&#xff08;Kernel Function&#xff09; 是機器學習中處理非線性問題的核心工具&#xff0c;通過隱式映射將數據從原始空間轉換到高維特征空間&#xff0c;從而在高維空間中實現線性可分或線性建模。其數學本質是計算兩個樣本在高維空間中的內積…

微服務架構中的精妙設計:服務注冊/服務發現-Eureka

一.使用注冊中心背景 1.1服務遠程調用問題 服務之間遠程調?時, 我們的URL是寫死的 String url "http://127.0.0.1:9090/product/" orderInfo.getProductId(); 缺點&#xff1a; 當更換機器, 或者新增機器時, 這個URL就需要跟著變更, 就需要去通知所有的相關服…

極速版:棧的內存/局部變量表/堆的內存細分

1. 棧的存儲 每個線程都有自己的棧&#xff0c;棧中數據以棧幀&#xff08;Stack Frame&#xff09;為基本單位 線程上正在執行的每個方法都各自對應一個棧楨&#xff08;Stack Frame&#xff09; 棧楨是一個內存區塊&#xff0c;是一個數據集&#xff0c;維系著方法執行過程…

【操作系統】內存泄漏 vs 內存碎片

【操作系統】內存泄漏 vs 內存碎片 內存泄漏&#xff08;Memory Leak&#xff09; vs 內存碎片&#xff08;Memory Fragmentation&#xff09;1. 內存泄漏&#xff08;Memory Leak&#xff09;2. 內存碎片&#xff08;Memory Fragmentation&#xff09;3. 內存泄漏 vs 內存碎片…

力扣HOT100之矩陣:73. 矩陣置零

這道題我沒有想到什么好的辦法&#xff0c;直接暴力AC了&#xff0c;直接遍歷兩次矩陣&#xff0c;第一次遍歷用兩個向量分別記錄出現0的行數和列數&#xff0c;第二次遍歷就判斷當前的元素的行數或者列數是否出現在之前的兩個向量中&#xff0c;若出現了就直接置零&#xff0c…

?Flink/Kafka在python中的用處

一、基礎概念 1. ?Apache Kafka 是什么&#xff1f; ?核心功能&#xff1a;Kafka 是一個分布式流處理平臺&#xff0c;主要用于構建實時數據管道和流式應用程序。?核心概念&#xff1a; ?生產者&#xff08;Producer&#xff09;?&#xff1a;向 Kafka 發送數據的程序。…

推薦系統(十八):優勢特征蒸餾(Privileged Features Distillation)在商品推薦中的應用

在商品推薦系統中&#xff0c;粗排和精排環節的知識蒸餾方法主要通過復雜模型&#xff08;Teacher&#xff09;指導簡單模型&#xff08;Student&#xff09;的訓練&#xff0c;以提升粗排效果及與精排的一致性。本文將以淘寶的一篇論文《Privileged Features Distillation at …

深度學習四大核心架構:神經網絡(NN)、卷積神經網絡(CNN)、循環神經網絡(RNN)與Transformer全概述

目錄 &#x1f4c2; 深度學習四大核心架構 &#x1f330; 知識點概述 &#x1f9e0; 核心區別對比表 ? 生活化案例理解 &#x1f511; 選型指南 &#x1f4c2; 深度學習四大核心架構 第一篇&#xff1a; 神經網絡基礎&#xff08;NN&#xff09; &#x1f330; 知識點概述…

R語言對偏態換數據進行轉換(對數、平方根、立方根)

我們進行研究的時候經常會遇見偏態數據&#xff0c;數據轉換是統計分析和數據預處理中的一項基本技術。使用 R 時&#xff0c;了解如何正確轉換數據有助于滿足統計假設、標準化分布并提高分析的準確性。在 R 中實現和可視化最常見的數據轉換&#xff1a;對數、平方根和立方根轉…

第十四屆藍橋杯省賽電子類單片機學習記錄(客觀題)

01.一個8位的DAC轉換器&#xff0c;供電電壓為3.3V&#xff0c;參考電壓2.4V&#xff0c;其ILSB產生的輸出電壓增量是&#xff08;D&#xff09;V。 A. 0.0129 B. 0.0047 C. 0.0064 D. 0.0094 解析&#xff1a; ILSB&#xff08;最低有效位&#xff09;的電壓增量計算公式…

HarmonyOSNext_API16_媒體查詢

媒體查詢條件詳解 媒體查詢是響應式設計的核心工具&#xff0c;通過判斷設備特征動態調整界面樣式。其完整規則由媒體類型、邏輯操作符和媒體特征三部分組成&#xff0c;具體解析如下&#xff1a; 一、媒體查詢語法結構 基本格式&#xff1a; [媒體類型] [邏輯操作符] (媒體特…

Python+拉普拉斯變換求解微分方程

引言 在數學和工程學中,微分方程廣泛應用于描述動態系統的行為,如電路、電氣控制系統、機械振動等。求解微分方程的一個常見方法是使用拉普拉斯變換,尤其是在涉及到初始條件時。今天,我們將通過 Python 演示如何使用拉普拉斯變換來求解微分方程,并幫助大家更好地理解這一…

【算法】手撕快速排序

快速排序的思想 任取一個元素作為樞軸&#xff0c;然后想辦法把這個區間劃分為兩部分&#xff0c;小于等于樞軸的放左邊&#xff0c;大于等于樞軸的放右邊 然后遞歸處理左右區間&#xff0c;直到空或只剩一個 具體動畫演示詳見 數據結構合集 - 快速排序(算法過程, 效率分析…

《八大排序算法》

相關概念 排序&#xff1a;使一串記錄&#xff0c;按照其中某個或某些關鍵字的大小&#xff0c;遞增或遞減的排列起來。穩定性&#xff1a;它描述了在排序過程中&#xff0c;相等元素的相對順序是否保持不變。假設在待排序的序列中&#xff0c;有兩個元素a和b&#xff0c;它們…