天天看點

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

本系列部落格将詳細闡述Activity的啟動流程,這些部落格基于Cm 10.1源碼研究。

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

<a href="http://www.cloudchou.com/android/post-788.html" target="_blank">深入了解Activity啟動流程(一)--Activity啟動的概要流程</a>

<a href="http://www.cloudchou.com/android/post-805.html" target="_blank">深入了解Activity啟動流程(三)--Activity啟動的詳細流程1</a>

<a href="http://www.cloudchou.com/android/post-815.html" target="_blank">深入了解Activity啟動流程(三)--Activity啟動的詳細流程2</a>

<a href="http://www.cloudchou.com/android/post-858.html" target="_blank">深入了解Activity啟動流程(四)--Activity Task的排程算法</a>

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

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

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

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

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

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

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

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的:

而是像下面這樣組織ActivityRecord:

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

但是ActivityManagerService排程ActivityRecord時以task為基本機關,每個ActivityRecord對象都屬于某個TaskRecord,一個TaskRecord可能有多個ActivityRecord。

ActivityStack沒有TaskRecord清單的入口,隻有在ActivityManagerService才有TaskRecord清單的入口:

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

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

回退棧裡可看到兩個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--&gt;D--&gt;C--&gt;B--&gt;A。

    本文轉自 一點點征服   部落格園部落格,原文連結:http://www.cnblogs.com/ldq2016/p/6889126.html,如需轉載請自行聯系原作者

繼續閱讀