日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android中ActivityManagerService与应用程序(客户端)通信模型分析

發(fā)布時間:2025/6/15 Android 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android中ActivityManagerService与应用程序(客户端)通信模型分析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
???

??????? 今天主要分析下ActivityManagerService(服務端) 與應用程序(客戶端)之間的通信模型,在介紹這個通信模型的基礎上,再

?? 簡單介紹實現(xiàn)這個模型所需要數(shù)據(jù)類型。

?

? ???? ?本文所介紹內(nèi)容基于android2.2版本。由于android版本的不同,本文所包含的一些類可能在命名等細節(jié)上做了一些更改,但

?? 萬變不離其宗,整個核心思想和通信流程依舊如下。

????????????例如,①、在android2.3上就將android2.2中ActivityManagerService的很處理邏輯提煉出來,形成了一個單獨的

??????? ActivityStack類,因而顯得更“高級”;

???????????????????? ②、將后文講解到的HistoryRecord.java直接重名名ActivityRecord.java等。

?

???????????? 很多不同點我也就不在細說了。大家在研究源碼的過程里,注意差異就成。

?

?

??? ? ?Android的三大核心功能有如下三個:

?????? ????1、View.java? ??關(guān)于View工作原理,《Android中View繪制流程以及invalidate()等相關(guān)方法分析》分析過。

?????????????????? 功能有: 繪制圖形、處理觸摸、按鍵事件等;

???? ?? ?? 2、ActivityManagerService.java??簡稱為 AMS

???????????????????功能有:管理所有應用程序的Activity 、內(nèi)存管理等 。

?????????? 3、WindowManagerService.java?簡稱為WMS

?????????????????? 功能有:為所有應用程序分配窗口,并管理這些窗口。

?

?

??????? 從上可知,AMS作為一種系統(tǒng)級服務管理所有Activity,當操作某個Activity時,例如: 啟動一個新的Activity、停止當前

??? Activity,必須報告給AMS,而不能“擅自處理”。當AMS接受到具體通知時,會根據(jù)該通知的類型,首先會更新內(nèi)部記錄,

??? 然后在通知相應客戶進程去運行一個新的Activity或者停止指定的Activity。另外,由于AMS記錄了所有Activity的信息,當然

??? 能夠主動的調(diào)度這些Activity,甚至在內(nèi)存不足時,主動殺死后臺的Activity。

?

????首先對模型中可能運到的類做一個介紹:

?????ActivityThread.java????路徑位于:\frameworks\base\core\java\android\app\ActivityThread.java

??????? ?說明: 該類為應用程序(即APK包)所對應進程(一個進程里可能有多個應用程序)的主線程類,即我們通常所說的UI線程。

?????????? 一個ActivityThread類對應于一個進程。最重要的是,每個應用程序的入口是該類中的static main()函數(shù) 。

???

????? Activity.java????????? ?????路徑位于:\frameworks\base\core\java\android\app\Activity.java

??????? 說明:該類是與用戶交互的對象,同時也是APK應用程序運行的最小單元。ActivityThread類會根據(jù)用戶的操作選擇運行

??????????哪個Activity。當前運行的Activity是出于resume狀態(tài)(有且僅有一個),其他Activity出于pause或stop狀態(tài)。

?

???? ?Instrumentation.java? 路徑位于 :\frameworks\base\core\java\android\app\ActivityThread.java

?????? ??說明: 該類用于具體操作某個Activity的功能----單向(oneway)調(diào)用AMS以及統(tǒng)計、測量該應用程序的所有開銷。

??????????? 一個Instrumentation類對應于一個進程。每個Activity內(nèi)部都有一個該Instrumentation對象的引用。

?

??? ? 舉個例子吧。

?????????? 我們將我們應用程序比作一個四合院,那么Activity對應于四合院的人,ActivithThread對應于院子的主人----管理所有人,

??? Instrumentation對應于管家------受氣的命,接受來自人(Activity/ActivithThread)的命令 ,去單向(oneway)調(diào)用AMS 。

?

??ApplicationThread類是ActivityThread的內(nèi)部類:

???????說明:該類是一個Binder類,即可實現(xiàn)跨進程通信。主要用于接受從AMS傳遞過來的消息,繼而做相應處理。

?

???ActivityManagerService.java?路徑位于:????????

?????????????????????????????????????? \frameworks\base\services\java\com\android\server\am\ActivityManagerService.java

?????? 說明:該類是一個Binder類,即可實現(xiàn)跨進程通信。因此可以接受從客戶端,例如Instrumentation、Context等調(diào)用過來的

?????????? 信息。ActivityManagerService提供了全局的代理對象,供IPC調(diào)用。

?

?

??AMS與ActivityThread的通信模型圖如下:

?

?????????????? ?????????

?

?

? 從該模型圖我們得知以下知識點:

?

?????? 第一、 引起調(diào)用AMS的對象通常有Context 、 Instrumentatio、ActivityThread等 。

?????? 第二、當AMS接受到來自某個應用程序傳來的消息后,在AMS內(nèi)部處理完畢后,會通過Binder機制回調(diào)回該應用程序

???????????? 所在ApplicationThread服務端類,即ActivityThread.java類。

?????? 第三、當ActivityThread接受到AMS傳遞過來的消息后,進行內(nèi)部處理。如果需要的話,會繼續(xù)與AMS通信。

?????? 最后,當整個通信完成時,ActivityThread會選擇合適的對象,例如Service、Activity、BroadcastReceiver等去做相應的

??????????? 處理。

?

?

?

? 最后,對通信模型設計到的設計到的數(shù)據(jù)類進行介紹:

?

??AMS 服務端用到的數(shù)據(jù)類:

????ProcessRecord.java??路徑:??\frameworks\base\services\java\com\android\server\am\ ProcessRecord.java

????????說明: 記錄每個進程的里的全部信息 。 主要信息包括該進程中包含的Activity、Provider、Service等信息、進程文件信息、

???????????? 該進程的內(nèi)存狀態(tài)信息。

??????? 源代碼(部分)如下:?

[java] view plaincopyprint?
  • /**?
  • ?*?Full?information?about?a?particular?process?that?is?currently?running.?
  • ?*/??
  • class?ProcessRecord?implements?Watchdog.PssRequestor?{??
  • ??
  • ????//?第一個應用程序的ApplicationInfo對象??
  • ????final?ApplicationInfo?info;?//?all?about?the?first?app?in?the?process??
  • ????final?String?processName;?//?name?of?the?process?進程名??
  • ????//?List?of?packages?running?in?the?process??
  • ????final?HashSet<String>?pkgList?=?new?HashSet();?//?該進程里運行的應用程序包名??
  • ????//?contains?HistoryRecord?objects??
  • ????final?ArrayList?activities?=?new?ArrayList();?//?保存該進程下所有Activity的信息<activty??
  • ????????????????????????????????????????????????????//?/>?AndroidManifest.xml??
  • ????//?all?ServiceRecord?running?in?this?process??
  • ????final?HashSet?services?=?new?HashSet();?//?保存該進程下所有Service的信息?<Service?/>??
  • }??
  • ??

    ?? ?HistoryRecord.java???路徑:\frameworks\base\services\java\com\android\server\am\HistoryRecord.java

    ?????????說明: 記錄每個Activity的全部信息,因為AMS不知道客戶端Activity的存在,因此在服務端用HistroyRecord對象來方便

    ???? 管理和統(tǒng)計對應客戶端Activity的信息。而且該類也是一個Binder類,因此可以跨進程調(diào)用。在客戶端中,ActivityThread同樣

    ???? 用HistroyRecord的“代理“ Proxy對象去標記對應的Activity。

    ??????? ?? 源代碼(部分)如下:

    [java] view plaincopyprint?
  • **??
  • ?*?An?entry?in?the?history?stack,?representing?an?activity.??
  • ?*/??
  • class?HistoryRecord?extends?IApplicationToken.Stub?{??
  • ??
  • ????final?ActivityInfo?info;?//?all?about?me?????
  • ????final?Intent?intent;?//?the?original?intent?that?generated?us???
  • ????final?String?shortComponentName;?//?the?short?component?name?of?the?intent????
  • ????TaskRecord?task;????????//?the?task?this?is?in.??該Activity對應Task的信息??
  • ????ProcessRecord?app;??//?if?non-null,?hosting?application?該Activity所在的進程信息??
  • ??????
  • ????boolean?stopped;????????//?is?activity?pause?finished???該Activity是否已經(jīng)停止?即onStop();??
  • ????boolean?delayedResume;??//?not?yet?resumed?because?of?stopped?app?switches??是否需要暫時停止啟動??
  • ????boolean?finishing;??????//?activity?in?pending?finish?list???是否正在finish?即殺死該Activity??
  • ??????
  • ????...??
  • }??
  • ?????TaskRecord.java???????路徑:\frameworks\base\services\java\com\android\server\am\TaskRecord.java

    ??????? ?說明: 記錄每個任務 Task的信息。 Activity可以運行在不同的Task中。

    ???????? ? 源代碼(部分)如下:

    [java] view plaincopyprint?
  • class?TaskRecord?{??
  • ????//?id???
  • ????final?int?taskId;???????//?Unique?identifier?for?this?task.??
  • ????final?String?affinity;??//?The?affinity?name?for?this?task,?or?null.??
  • ????final?boolean?clearOnBackground;?//?As?per?the?original?activity.??
  • ????//啟動一個新的Task的的Intent信息??
  • ????Intent?intent;??????????//?The?original?intent?that?started?the?task.??
  • ????Intent?affinityIntent;??//?Intent?of?affinity-moved?activity?that?started?this?task.??
  • ????ComponentName?origActivity;?//?The?non-alias?activity?component?of?the?intent.??
  • ????ComponentName?realActivity;?//?The?actual?activity?component?that?started?the?task.??
  • ????//運行在該Task的Activity數(shù)目??
  • ????int?numActivities;??????//?Current?number?of?activities?in?this?task.??
  • }??
  • ??? ActivityManagerService.java

    ??????? PS:該類還是相當龐大的,有著琳瑯滿目的數(shù)據(jù)對象,稍不注意,就給迷失了。

    ?????????? 源代碼(部分)如下:

    [java] view plaincopyprint?
  • class?ActivityManagerService?extends?ActivityManagerNative?implements?xxx?{??
  • ????//?This?is?the?maximum?number?of?activities?that?we?would?like?to?have??
  • ????//?running?at?a?given?time.??
  • ????static?final?int?MAX_ACTIVITIES?=?20;??//系統(tǒng)中正在運行的Activity數(shù)目,最大為20??
  • ????//?Maximum?number?of?recent?tasks?that?we?can?remember.??
  • ????static?final?int?MAX_RECENT_TASKS?=?20;?//最大的Task數(shù)目為20??????
  • ????/**?
  • ?????*?The?back?history?of?all?previous?(and?possibly?still?
  • ?????*?running)?activities.??It?contains?HistoryRecord?objects.?
  • ?????*/??//當前系統(tǒng)中正在運行的Activity信息,即處于onPause、onStop、onResume狀態(tài)的Activity信息??
  • ????final?ArrayList?mHistory?=?new?ArrayList();????
  • ??
  • ????/**?
  • ?????*?Current?activity?that?is?resumed,?or?null?if?there?is?none.?
  • ?????*/??
  • ????HistoryRecord?mResumedActivity?=?null;??//當前正在于用戶交互的Activity信息,即處于onResume狀態(tài)。??
  • ????/**?
  • ?????*?When?we?are?in?the?process?of?pausing?an?activity,?before?starting?the?
  • ?????*?next?one,?this?variable?holds?the?activity?that?is?currently?being?paused.?
  • ?????*/??
  • ????HistoryRecord?mPausingActivity?=?null;??//當前正在暫停的Activity信息,即正在onPause();??
  • ????/**?
  • ?????*?All?of?the?applications?we?currently?have?running?organized?by?name.?
  • ?????*?The?keys?are?strings?of?the?application?package?name?(as?
  • ?????*?returned?by?the?package?manager),?and?the?keys?are?ApplicationRecord?
  • ?????*?objects.?
  • ?????*/??//當前正在運行的Process信息??
  • ????final?ProcessMap<ProcessRecord>?mProcessNames??=?new?ProcessMap<ProcessRecord>();??
  • ????//開始啟動一個Activity??
  • ????public?final?int?startActivity(){?...}??
  • }??
  • ?

    ?ActivityThread所在客戶端 :

    ?

    ?? 基本對象都已在開篇介紹過,ActivityThread 、ApplicationThread 類。

    ???? ActivityThread .java?

    ????????? 源代碼(部分)如下:

    [java] view plaincopyprint?
  • /**?
  • ?*?This?manages?the?execution?of?the?main?thread?in?an?
  • ?*?application?process,?scheduling?and?executing?activities,?
  • ?*?broadcasts,?and?other?operations?on?it?as?the?activity?
  • ?*?manager?requests.?
  • ?*?
  • ?*?{@hide}?
  • ?*/??
  • public?final?class?ActivityThread?{??
  • ??????
  • ?????//保存了該進程里所有正在運行的Activity信息??,?即沒有onDestroy()的Activity??
  • ?????//IBinder對象是HistoryRecord的代理對象,在客戶端已IBinder標記每個Activity信息??
  • ?????final?HashMap<IBinder,?ActivityRecord>?mActivities?=?new?HashMap<IBinder,?ActivityRecord>();??
  • ???????
  • ?????final?H?mH?=?new?H();??//?H對象?,Handler子類??
  • ?????Instrumentation?mInstrumentation;??
  • ?????...??
  • }??
  • ?

    ??? ApplicationThread????是ActivityThread的內(nèi)部類

    ??????? 源代碼(部分)如下:

    [java] view plaincopyprint?
  • public?final?class?ActivityThread?{??
  • ????...???
  • ????//Binder類?主用功能是接受從AMS傳遞過來的消息,做處理后轉(zhuǎn)發(fā)給H類去進一步處理。??
  • ????private?final?class?ApplicationThread?extends?ApplicationThreadNative{??
  • ?????????public?final?void?schedulePauseActivity(){...}??
  • ??????????public?final?void?scheduleSendResult{...}??
  • ??????????public?final?void?scheduleSendResult(){...}??
  • ????}??
  • }??

  • ? ?最后介紹一下ActivityThread的兩個內(nèi)部類。

    ?

    ???? H類????? 是ActivityThread的內(nèi)部類

    ???????說明 :H類是一個Hander子類 ,該類僅僅是為了異步調(diào)用而設計的,使用方法同Hander類一樣。

    ?????????? 源代碼(部分)如下:

    [java] view plaincopyprint?
  • public?final?class?ActivityThread?{???
  • ????...??
  • ????private?final?class?H?extends?Handler?{??
  • ????????????
  • ????????private?H()?{??
  • ???????????SamplingProfiler.getInstance().setEventThread(mLooper.getThread());??
  • ????????}??
  • ????????//處理消息??
  • ????????public?void?handleMessage(Message?msg){??
  • ?????????????switch?(msg.what)?{??
  • ???????????????case?LAUNCH_ACTIVITY:?{??
  • ?????????????????//啟動一個Activity??
  • ?????????????????ActivityRecord?r?=?(ActivityRecord)msg.obj;??
  • ?????????????????r.packageInfo?=?getPackageInfoNoCheck(??
  • ?????????????????????????r.activityInfo.applicationInfo);??
  • ?????????????????handleLaunchActivity(r,?null);???????????????????
  • ???????????????}???
  • ???????????????...??
  • ?????????????}??
  • ????????}??
  • ???}??
  • }??

  • ?ActivityRecord類同樣是ActivityThread的內(nèi)部類

    ???????說明:在客戶端保存當前Activity的相關(guān)信息,方便ActivityThread管理維護Activity。這個類在實現(xiàn)和功能上對應于AMS的

    ??????????HistoryRecord類。

    ???????????源代碼(部分)如下:

    [java] view plaincopyprint?
  • <span?style="font-size:16px;">public?final?class?ActivityThread{??
  • ????...??
  • ????//記錄了客戶端Activity的信息??
  • ????private?static?final?class?ActivityRecord?{??
  • ?????????IBinder?token;??//該變量對應于AMS服務端HistoryRecord對象??
  • ?????????Intent?intent;??//啟動該Activity對應的intent信息??
  • ?????????Bundle?state;???//保存一些信息??onCreate(state)??
  • ?????????Activity?activity;??//對應于Activity類??
  • ?????????ActivityInfo?activityInfo;??//對應的ActivityInfo對象??
  • ?????????...??
  • ????}??
  • }</span>??
  • ??????

    ??????????? 另外我再對客戶端Activity、ActivityRecord、ActivityThread 類包含的IBinder token屬性進行一下說明:該token變量

    ???? 實際上指向的的ActivityManagerService的HistoryRecord對象,他們是一一對應的。在應用程序內(nèi)部和AMS都通過該token

    ?? ? 變量來標記我們實際需要的Activity信息。 如下圖所示:

    ?

    ??????????????????????????

    ?

    ?????? ? 對ActivityManagerService通信模型以及數(shù)據(jù)類有一定認識后,那么現(xiàn)在你就可以具體去接觸每個操作是怎么實現(xiàn)的了。 例

    ? 如?startActivity()、 registerReceiver()等。 后面我也會慢慢講解到的,有興趣的可以先看如下兩篇吧。講解的都挺詳細的,反正

    ? 我是偷了?不少經(jīng)。 O(∩_∩)O~

    總結(jié)

    以上是生活随笔為你收集整理的Android中ActivityManagerService与应用程序(客户端)通信模型分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。