Android中ActivityManagerService与应用程序(客户端)通信模型分析
??????? 今天主要分析下ActivityManagerService(服務端) 與應用程序(客戶端)之間的通信模型,在介紹這個通信模型的基礎上,再
?? 簡單介紹實現這個模型所需要數據類型。
?
? ???? ?本文所介紹內容基于android2.2版本。由于android版本的不同,本文所包含的一些類可能在命名等細節上做了一些更改,但
?? 萬變不離其宗,整個核心思想和通信流程依舊如下。
????????????例如,①、在android2.3上就將android2.2中ActivityManagerService的很多處理邏輯提煉出來,形成了一個單獨的
??????? ActivityStack類,因而顯得更“高級”;
???????????????????? ②、將后文講解到的HistoryRecord.java直接重名名為ActivityRecord.java等。
?
???????????? 很多不同點我也就不在細說了。大家在研究源碼的過程里,注意差異就成。
?
?
??? ? ?Android的三大核心功能有如下三個:
?????? ????1、View.java? ??關于View工作原理,《Android中View繪制流程以及invalidate()等相關方法分析》分析過。
?????????????????? 功能有: 繪制圖形、處理觸摸、按鍵事件等;
???? ?? ?? 2、ActivityManagerService.java??簡稱為 AMS
???????????????????功能有:管理所有應用程序的Activity 、內存管理等 。
?????????? 3、WindowManagerService.java?簡稱為WMS
?????????????????? 功能有:為所有應用程序分配窗口,并管理這些窗口。
?
?
??????? 從上可知,AMS作為一種系統級服務管理所有Activity,當操作某個Activity時,例如: 啟動一個新的Activity、停止當前
??? Activity,必須報告給AMS,而不能“擅自處理”。當AMS接受到具體通知時,會根據該通知的類型,首先會更新內部記錄,
??? 然后在通知相應客戶進程去運行一個新的Activity或者停止指定的Activity。另外,由于AMS記錄了所有Activity的信息,當然
??? 能夠主動的調度這些Activity,甚至在內存不足時,主動殺死后臺的Activity。
?
????首先對模型中可能運到的類做一個介紹:
?????ActivityThread.java????路徑位于:\frameworks\base\core\java\android\app\ActivityThread.java
??????? ?說明: 該類為應用程序(即APK包)所對應進程(一個進程里可能有多個應用程序)的主線程類,即我們通常所說的UI線程。
?????????? 一個ActivityThread類對應于一個進程。最重要的是,每個應用程序的入口是該類中的static main()函數 。
???
????? Activity.java????????? ?????路徑位于:\frameworks\base\core\java\android\app\Activity.java
??????? 說明:該類是與用戶交互的對象,同時也是APK應用程序運行的最小單元。ActivityThread類會根據用戶的操作選擇運行
??????????哪個Activity。當前運行的Activity是出于resume狀態(有且僅有一個),其他Activity出于pause或stop狀態。
?
???? ?Instrumentation.java? 路徑位于 :\frameworks\base\core\java\android\app\ActivityThread.java
?????? ??說明: 該類用于具體操作某個Activity的功能----單向(oneway)調用AMS以及統計、測量該應用程序的所有開銷。
??????????? 一個Instrumentation類對應于一個進程。每個Activity內部都有一個該Instrumentation對象的引用。
?
??? ? 舉個例子吧。
?????????? 我們將我們應用程序比作一個四合院,那么Activity對應于四合院的人,ActivithThread對應于院子的主人----管理所有人,
??? Instrumentation對應于管家------受氣的命,接受來自人(Activity/ActivithThread)的命令 ,去單向(oneway)調用AMS 。
?
??ApplicationThread類是ActivityThread的內部類:
???????說明:該類是一個Binder類,即可實現跨進程通信。主要用于接受從AMS傳遞過來的消息,繼而做相應處理。
?
???ActivityManagerService.java?路徑位于:????????
?????????????????????????????????????? \frameworks\base\services\java\com\android\server\am\ActivityManagerService.java
?????? 說明:該類是一個Binder類,即可實現跨進程通信。因此可以接受從客戶端,例如Instrumentation、Context等調用過來的
?????????? 信息。ActivityManagerService提供了全局的代理對象,供IPC調用。
?
?
??AMS與ActivityThread的通信模型圖如下:
?
?????????????? ?????????
?
?
? 從該模型圖我們得知以下知識點:
?
?????? 第一、 引起調用AMS的對象通常有Context 、 Instrumentatio、ActivityThread等 。
?????? 第二、當AMS接受到來自某個應用程序傳來的消息后,在AMS內部處理完畢后,會通過Binder機制回調回該應用程序
???????????? 所在ApplicationThread服務端類,即ActivityThread.java類。
?????? 第三、當ActivityThread接受到AMS傳遞過來的消息后,進行內部處理。如果需要的話,會繼續與AMS通信。
?????? 最后,當整個通信完成時,ActivityThread會選擇合適的對象,例如Service、Activity、BroadcastReceiver等去做相應的
??????????? 處理。
?
?
?
? 最后,對通信模型設計到的設計到的數據類進行介紹:
?
??AMS 服務端用到的數據類:
????ProcessRecord.java??路徑:??\frameworks\base\services\java\com\android\server\am\ ProcessRecord.java
????????說明: 記錄每個進程的里的全部信息 。 主要信息包括該進程中包含的Activity、Provider、Service等信息、進程文件信息、
???????????? 該進程的內存狀態信息。
??????? 源代碼(部分)如下:?
[java] view plaincopyprint???
?? ?HistoryRecord.java???路徑:\frameworks\base\services\java\com\android\server\am\HistoryRecord.java
?????????說明: 記錄每個Activity的全部信息,因為AMS不知道客戶端Activity的存在,因此在服務端用HistroyRecord對象來方便
???? 管理和統計對應客戶端Activity的信息。而且該類也是一個Binder類,因此可以跨進程調用。在客戶端中,ActivityThread同樣
???? 用HistroyRecord的“代理“ Proxy對象去標記對應的Activity。
??????? ?? 源代碼(部分)如下:
[java] view plaincopyprint??????TaskRecord.java???????路徑:\frameworks\base\services\java\com\android\server\am\TaskRecord.java
??????? ?說明: 記錄每個任務 Task的信息。 Activity可以運行在不同的Task中。
???????? ? 源代碼(部分)如下:
[java] view plaincopyprint???? ActivityManagerService.java
??????? PS:該類還是相當龐大的,有著琳瑯滿目的數據對象,稍不注意,就給迷失了。
?????????? 源代碼(部分)如下:
[java] view plaincopyprint??
?ActivityThread所在客戶端 :
?
?? 基本對象都已在開篇介紹過,ActivityThread 、ApplicationThread 類。
???? ActivityThread .java?
????????? 源代碼(部分)如下:
[java] view plaincopyprint??
??? ApplicationThread????是ActivityThread的內部類
??????? 源代碼(部分)如下:
[java] view plaincopyprint?
? ?最后介紹一下ActivityThread的兩個內部類。
?
???? H類????? 是ActivityThread的內部類
???????說明 :H類是一個Hander子類 ,該類僅僅是為了異步調用而設計的,使用方法同Hander類一樣。
?????????? 源代碼(部分)如下:
[java] view plaincopyprint?
?ActivityRecord類同樣是ActivityThread的內部類
???????說明:在客戶端保存當前Activity的相關信息,方便ActivityThread管理維護Activity。這個類在實現和功能上對應于AMS的
??????????HistoryRecord類。
???????????源代碼(部分)如下:
[java] view plaincopyprint???????
??????????? 另外我再對客戶端Activity、ActivityRecord、ActivityThread 類包含的IBinder token屬性進行一下說明:該token變量
???? 實際上指向的的ActivityManagerService的HistoryRecord對象,他們是一一對應的。在應用程序內部和AMS都通過該token
?? ? 變量來標記我們實際需要的Activity信息。 如下圖所示:
?
??????????????????????????
?
?????? ? 對ActivityManagerService通信模型以及數據類有一定認識后,那么現在你就可以具體去接觸每個操作是怎么實現的了。 例
? 如?startActivity()、 registerReceiver()等。 后面我也會慢慢講解到的,有興趣的可以先看如下兩篇吧。講解的都挺詳細的,反正
? 我是偷了?不少經。 O(∩_∩)O~
總結
以上是生活随笔為你收集整理的Android中ActivityManagerService与应用程序(客户端)通信模型分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Microsoft Visual Stu
- 下一篇: Android4.4 framework