深入理解Activity啟動流程(二)–Activity啟動相關類的類圖

本文原創作者:Cloud Chou. 歡迎轉載,請注明出處和本文鏈接

本系列博客將詳細闡述Activity的啟動流程,這些博客基于Cm 10.1源碼研究。

在介紹Activity的詳細啟動流程之前,先為大家介紹Activity啟動時涉及到的類,這樣大家可以有大概的了解,不至于在細節中迷失。

  • 深入理解Activity啟動流程(一)--Activity啟動的概要流程
  • 深入理解Activity啟動流程(三)--Activity啟動的詳細流程1
  • 深入理解Activity啟動流程(三)--Activity啟動的詳細流程2
  • 深入理解Activity啟動流程(四)--Activity Task的調度算法

Activity啟動時涉及到的類有IActivityManager相關類, IApplicationThread相關類, ActivityManagerService相關類。

IActivityManager相關類

點擊圖片可看大圖

IActivityManager

Activity的管理采用binder機制,管理Activity的接口是IActivityManager. ActivityManagerService實現了Activity管理功能,位于system_server進程,ActivityManagerProxy對象是ActivityManagerService在普通應用進程的一個代理對象,應用進程通過ActivityManagerProxy對象調用ActivityManagerService提供的功能。應用進程并不會直接創建ActivityManagerProxy對象,而是通過調用ActiviyManagerNative類的工具方法getDefault方法得到ActivityManagerProxy對象。所以在應用進程里通常這樣啟動Activty:

1
ActivityManagerNative.getDefault().startActivity() 

IApplicationThread相關類

點擊圖片可看大圖

IApplicationThread

應用進程需要調用ActivityManagerService提供的功能,而ActivityManagerService也需要主動調用應用進程以控制應用進程并完成指定操作。這樣ActivityManagerService也需要應用進程的一個Binder代理對象,而這個代理對象就是ApplicationThreadProxy對象。

ActivityManagerService通過IApplicationThread接口管理應用進程,ApplicationThread類實現了IApplicationThread接口,實現了管理應用的操作,ApplicationThread對象運行在應用進程里。ApplicationThreadProxy對象是ApplicationThread對象在ActivityManagerService線程 (ActivityManagerService線程運行在system_server進程)內的代理對象,ActivityManagerService通過ApplicationThreadProxy對象調用ApplicationThread提供的功能,比如讓應用進程啟動某個Activity。

ActivityManagerService相關類

點擊圖片可看大圖

ActivityManagerService

ActivityManagerService管理Activity時,主要涉及以下幾個類:

  • 1)\tActivityManagerService,它是管理activity的入口類,聚合了ProcessRecord對象和ActivityStack對象
  • 2)\tProcessRecord,表示應用進程記錄,每個應用進程都有對應的ProcessRecord對象
  • 3)\tActivityStack,該類主要管理回退棧
  • 4)\tActivityRecord,每次啟動一個Actvity會有一個對應的ActivityRecord對象,表示Activity的一個記錄
  • 5)\tActivityInfo,Activity的信息,比如啟動模式,taskAffinity,flag信息(這些信息在AndroidManifest.xml里聲明Activity時填寫)
  • 6)\tTaskRecord,Task記錄信息,一個Task可能有多個ActivityRecord,但是一個ActivityRecord只能屬于一個TaskRecord

注意:

ActivityManagerService里只有一個ActivityStack對象,并不會像Android官方文檔描述的一樣,每個Task都有一個activity stack對象。ActivityStack管理ActivityRecord時,不是下面這樣組織ActivityRecord的:

1
2
List<TaskRecord> taskList; //ActivityStack類 List<ActivityRecord> recordList;// TaskRecord類 

而是像下面這樣組織ActivityRecord:

1
2
ArrayList<ActivityRecord> mHistory = new ArrayList<ActivityRecord>(); //ActivityStack類里 TaskRecord task; // ActivityRecord類里 

也就是說ActivityManagerService組織回退棧時以ActivityRecord為基本單位,所有的ActivityRecord放在同一個ArrayList里,可以將mHistory看作一個棧對象,索引0所指的對象位于棧底,索引mHistory.size()-1所指的對象位于棧頂。

但是ActivityManagerService調度ActivityRecord時以task為基本單位,每個ActivityRecord對象都屬于某個TaskRecord,一個TaskRecord可能有多個ActivityRecord。

ActivityStack沒有TaskRecord列表的入口,只有在ActivityManagerService才有TaskRecord列表的入口:

1
final ArrayList<TaskRecord> mRecentTasks 

ActivityStack管理ActivityRecord時,將屬于同一個task的ActivityRecord放在一起,如下所示:

backstack

回退棧里可看到兩個task,假設上面的task為task1,下面的task為task2,task1包含D,E兩個Activity Record,task2包含3個ActivityRecord。task1位于回退棧的棧頂,task2位于task1下面,task1中E位于棧頂,task2中C位于棧頂。需注意兩個task的Activity不會混在一起,也就是說task2的B不能放在task1的D和E中間。

因為回退棧是棧結構,所以此時不斷按返回鍵,顯示的Activity的順序為E-->D-->C-->B-->A。

下一篇博客為大家講述Activity的詳細啟動流程。

轉載于:https://www.cnblogs.com/ldq2016/p/6889126.html

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

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

相關文章

Lines色線halcon算子,持續更新

目錄bandpass_imagelines_colorlines_facetlines_gaussbandpass_image 功能&#xff1a;使用帶通濾波器提取邊緣。 lines_color 功能&#xff1a;檢測色線和它們的寬度。 lines_facet 功能&#xff1a;使用面模型檢測線。 lines_gauss 功能&#xff1a;檢測線和它們的寬…

疑問+軟件

問題 1學好軟件工程需要打好哪些基礎&#xff1f; 2怎樣學好軟件工程&#xff1f; 3軟件工程的發展前景如何&#xff1f; 4軟件工程具體能從事哪些職業&#xff1f; 5怎樣準確的找到自己的定位&#xff1f; 軟件 1支付寶 優點&#xff1a;支付便捷&#xff0c;轉賬方便&#xf…

成功的項目管理

內容提要 第一講 項目與項目管理 1.項目的基本概念 2.項目管理的概念 3.項目管理的重要性 第二講 項目管理的最新發展 1.現代項目管理的創立過程 2.現代項目管理的發展趨勢 3.項目管理流行的原因 第三講 信息時代的項目管理 1.信息時代的特點 2.信息時代項目管理的特點 3.按項目…

5月23日

11.1 LAMP架構介紹一、LAMP架構介紹LAMP是LinuxApache(httpd)MySQLPHP的簡寫&#xff0c;即把Apache、MySQL以及PHP安裝在linux系統上&#xff0c;組成一個運行環境來運行PHP腳本語言&#xff0c;通常是網站。比如Google、淘寶、百度、51cto博客、猿課論壇等就是用PHP語言寫出來…

Kotlin入門簡介

Kotlin的“簡歷” 來自于著名的IDE IntelliJ IDEA(Android Studio基于此開發) 軟件開發公司 JetBrains(位于東歐捷克)起源來自JetBrains的圣彼得堡團隊&#xff0c;名稱取自圣彼得堡附近的一個小島(Kotlin Island)一種基于JVM的靜態類型編程語言語法簡單&#xff0c;不啰嗦 1 2…

LaTeX基礎一:安裝與基本操作

一、安裝 1.首先下載texlive2015.iso文件。再在解壓的鏡像文件中運行install-tl-advanced.bat批處理命令。注意要關閉殺毒軟件&#xff0c;否則可能會出現錯誤。2.可以修改一下安裝路徑&#xff0c;只要更改一個&#xff0c;其他也隨之更改&#xff1a;3.把不要安裝的語言包去掉…

Match圖像匹配halcon算子,持續更新

目錄exhaustive_matchexhaustive_match_mggen_gauss_pyramidmonotonyexhaustive_match 功能&#xff1a;模板和圖像的匹配。 exhaustive_match_mg 功能&#xff1a;在一個分辨率塔式結構中匹配模板和圖像。 gen_gauss_pyramid 功能&#xff1a;計算一個高斯金字塔。 mono…

c++虛函數的前奏--函數指針與回調

聲明函數指針并實現回調程序員常常需要實現回調。本文將討論函數指針的基本原則并說明如何使用函數指針實現回調。注意這里針對的是普通的函數&#xff0c;不包括完全依賴于不同語法和語義規則的類成員函數&#xff08;類成員指針將在另文中討論&#xff09;。 聲明函數指針 …

你的微信,到底「連接」多少人?

作為一個技術人&#xff0c;用微信這么多年&#xff0c;也加了不少的好友和技術群。大半個月前&#xff0c;大概是5月初的時候&#xff0c;萌生了這個想法。 前后磕磕絆絆&#xff0c;經過了來美帝出差前期差點餓死、項目緊急期等艱難階段以及各種自學、溫習和設計&#xff0c;…

團隊項目第一周總結

團隊項目第一周總結 今天是周一&#xff0c;項目的進展周期已經進行了一周&#xff0c;做一個大概的總結吧。 周的工作先是定下團隊的項目方向&#xff0c;大家技術程度各有不同&#xff0c;因此想大一統的定下一個有些稍稍的花費時間。定好《基于大數據的日志分析》這個題目后…

電路寬度測量halcon例子

一個halcon處理的例子 目錄處理要求&#xff1a;原圖&#xff1a;處理程序&#xff1a;處理結果&#xff1a;處理要求&#xff1a; 根據客戶給的寬度&#xff0c;計算出電路寬度太窄的為NG 原圖&#xff1a; 處理程序&#xff1a; read_image (Image, 1.png) rgb1_to_gray(I…

深入理解C/C++函數指針

函數指針數組的妙用 筆者在開發某軟件過程中遇到這樣一個問題&#xff0c;前級模塊傳給我二進制數據&#xff0c;輸入參數為 char* buffer和 int length&#xff0c;buffer是數據的首地址&#xff0c;length表示這批數據的長度。數據的特點是&#xff1a;長度不定&#xff0c…

iOS顯示性能優化過程講解

點我跳轉原文地址 卡頓的原理 iOS系統界面滑動流暢性的保持主要是依靠CPU和GPU兩大處理硬件間通力合作的結果&#xff0c;一個視圖的顯示需要先經過CPU創建、布局計算、對圖片解碼、文本繪制&#xff0c;然后CPU將計算的結果交給GPU&#xff0c;GPU可能需要對圖形進行變換、合成…

asp.net web api集成微信服務(使用Senparc微信SDK)

/// <summary>/// 微信請求轉發控制器/// </summary>[RoutePrefix("weixin")]public class WeixinController : ApiController{#region 創建微信菜單/// <summary>/// 創建微信菜單/// </summary>/// <returns></returns>[HttpP…

1.SoapUI接口測試--創建項目

1、點擊File-->New soapUI Project 2、填寫項目名稱&#xff0c;接口服務地址后單擊【OK】按鈕后就成功創建了一個項目 3、模擬發送請求 4、創建請求 或者直接Copy一個請求 5、保存項目 6、項目是以xml的格式保存的&#xff0c;下次用的時候可以直接導入&#xff0c;點擊Fil…

Misc混合halcon算子,持續更新

目錄convol_imageexpand_domain_graygray_insidegray_skeletonlut_transsymmetrytopographic_sketchdeviation_nconvol_image 功能&#xff1a;用一個任意濾波掩碼對一個圖像卷積。 expand_domain_gray 功能&#xff1a;擴大圖像區域并且在擴大的區域中設置灰度值。 gray_i…

C/C++ 函數指針調用函數

01//C/C 函數指針調用函數 02#include<iostream> 03using namespace std; 04 05void site1() 06{ 07 cout<<"www.ok2002.com"<<endl; 08} 09 10void site2() 11{ 12 cout<<"www.ok1700.com"<<endl; 13} 14 15void…

漢字編碼

漢字編碼 一、漢字所占的字節數 對于一個字符串sizeof("請放手")&#xff0c;結果值是4。測試操作系統&#xff1a;Centos 6.4&#xff0c;硬件平臺&#xff1a;Windows 7 32位 VirtualBox 4.3.12。看來用sizeof()來計算漢字所占用的字節或空間是不準確的。strlen(&…

Noise噪音halcon算子,持續更新

目錄add_noise_distributionadd_noise_whitegauss_distributionnoise_distribution_meansp_distributionadd_noise_distribution 功能&#xff1a;向一個圖像添加噪聲。 add_noise_white 功能&#xff1a;向一個圖像添加噪聲。 gauss_distribution 功能&#xff1a;產生一…

sublime text3 package control 報錯

安裝sublime text3之后&#xff0c;安裝package control 報錯&#xff0c;錯誤信息&#xff1a;There are no packages available for installation 根據提示&#xff0c;找到錯誤解決辦法&#xff1a;https://packagecontrol.io/doc... 其實意思就是你的電腦代理出了問題&…