Android - AMS源碼分析

來源:互聯網
上載者:User

標籤:end   nat   回調   靜態   觀察   ide   png   androi   server   

Android核心分析之AMS

 

 

App和AMS(SystemServer進程)還有zygote進程分屬於三個獨立的進程

App與AMS通過Binder進行IPC通訊,AMS(SystemServer進程)與zygote通過Socket進行IPC通訊。

 

開啟一個APPLauncher

Launcher負責案頭表徵圖的顯示和控制,本質上也是一個應用程式,和我們的App一樣,也是繼承自Activity

以雙擊開啟一個APP為例:

不管在哪裡點擊表徵圖,都會調用

mLauncher.startActivitySafely(v, appInfo.intent, appInfo);

這個方法,最後調用startActivityForResult()

而startActivityForResult()調用的是mInstrumentation.execStartActivity()。

 

InstrumentationInstrumentation,每一個應用程式只有一個Instrumentation對象,每個Activity內都有一個對該對象的引用。Instrumentation可以理解為應用進程的管家,ActivityThread要建立或暫停某個Activity時,都需要通過Instrumentation來進行具體的操作。 AMS是董事會,負責指揮和調度的,ActivityThread是老闆,雖然說家裡的事自己說了算,但是需要聽從AMS的指揮,而Instrumentation則是老闆娘,負責家裡的大事小事,但是一般不拋頭露面,聽一家之主ActivityThread的安排。 AMS和ActivityThread之間的Binder通訊

mInstrumentation.execStartActivity()接下來調用了這個方法

ActivityManagerNative.getDefault()                .startActivity

這裡的ActivityManagerNative.getDefault返回的就是ActivityManagerService的遠程介面,即ActivityManagerProxy。

再看ActivityManagerProxy.startActivity(),在這裡面做的事情就是IPC通訊,利用Binder對象,調用transact(),把所有需要的參數封裝成Parcel對象,向AMS發送資料進行通訊。

ActivityManagerNative源碼:

public abstract class ActivityManagerNative extends Binder implements IActivityManager{//從類聲明上,我們可以看到ActivityManagerNative是Binder的一個子類,而且實現了IActivityManager介面 static public IActivityManager getDefault() {        return gDefault.get();    } //通過單例模式擷取一個IActivityManager對象,這個對象通過asInterface(b)獲得 private static final Singleton<IActivityManager> gDefault = new Singleton<IActivityManager>() {        protected IActivityManager create() {            IBinder b = ServiceManager.getService("activity");            if (false) {                Log.v("ActivityManager", "default service binder = " + b);            }            IActivityManager am = asInterface(b);            if (false) {                Log.v("ActivityManager", "default service = " + am);            }            return am;        }    };}//最終返回的還是一個ActivityManagerProxy對象static public IActivityManager asInterface(IBinder obj) {        if (obj == null) {            return null;        }        IActivityManager in =            (IActivityManager)obj.queryLocalInterface(descriptor);        if (in != null) {            return in;        }     //這裡面的Binder類型的obj參數會作為ActivityManagerProxy的成員變數儲存為mRemote成員變數,負責進行IPC通訊        return new ActivityManagerProxy(obj);    }}

很清楚看到ActivityManagerNative繼承Binder,是Binder本機物件。IActivityManager是遠程介面,代表AMS能提供的功能。

ActivityManagerProxy是AMS的遠程代理對象,Activity可以通過代理對象調用AMS提供的介面中方法。

所以App與AMS通過Binder進行IPC通訊

 AMS向ActivityThread通訊

以上解釋了activity向AMS通訊的方法,

如果AMS想要通知ActivityThread做一些事情,應該咋辦呢?

還是通過Binder通訊,不過是換了另外一對,換成了ApplicationThread和ApplicationThreadProxy。

private class ApplicationThread extends ApplicationThreadNative {}  public abstract class ApplicationThreadNative extends Binder implements IApplicationThread{}  class ApplicationThreadProxy implements IApplicationThread {}

 

AMS接收到用戶端的請求之後,會如何開啟一個Activity?

可以看上面那個圖,大致就是AMS得到activity棧的引用,然後根據啟動模式添加到棧中,最後回調applicationThread執行原activity的pause

 

 

廣播

為什麼需要廣播

  廣播是作業系統framework層對觀察者模式(observer)最常用的實現方式

  一個軟體系統常常要求在某一個對象的狀態發生變化的時候,某些其它的對象做出相應的改變。做到這一點的設計方案有很多,但是為了使系統能夠易於複用,應該選擇低耦合度的設計方案。減少對象之間的耦合有利於系統的複用,但是同時設計師需要使這些低耦合度的對象之間能夠維持行動的協調一致,保證高度的協作。觀察者模式是滿足這一要求的各種設計方案中最重要的一種。

 

廣播發送的api有:?sendBroadcast?sendOrderBroadcast?sendStickyBroadcast?監聽廣播的方式有:?動態註冊使用registerReceiver方式?靜態註冊在AndroidManifest.xml中定義BroadcastReceiver類並實現

廣播有哪幾種

 

     廣播有無序廣播、有序廣播和粘性廣播,其中粘性廣播需要有BROADCAST_STICKY許可權

 

Service

Service是什麼

    Service是Android系統的組件之一,和Activity,Broadcast,Conent Provider並稱Android四大組件,Service是不可見的,是沒有介面的,是在後台啟動並執行,Service一般處理比較耗時以及長時間啟動並執行操作

Service的啟動有兩種方式:

 1. startService主要用於啟動一個服務執行背景工作,不進行通訊,停止服務使用stopService

 2. bindService該方法啟動的服務可以獲得該service的狀態,停止服務使用unbindService

 

Android - AMS源碼分析

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.