1.建立Activity和Service的IPC之前

在上一篇 Binder機制,從Java到C (1. IPC in Application Remote Service)  裡面有說到Activity通過AMS的bindService(),觸發Service的onBind(),然後會呼叫Client的onServiceConnected() 回撥方法,把一個Binder代理物件傳遞給Client。

那實際上,AMS也是一個Service,那它是執行在另外一個process,所以Activity要呼叫AMS.bindService()。來建立Application Activity和Service的IPC通訊之前,首先得和AMS進行IPC通訊。

我們在開發過程中,經常會建立一個Intent,然後start Activitystart Servicesend broadcast
如下面圖中所示,所有Intent,都會通過IActivityManager走入Activity,Service,Broadcast三個不同的處理方法。這些處理都是在另外一個process進行的。就是AMS所在的程序。

2.AMS 框架

在AMS中,沒有使用aidl,而是自己去實現了Stub端和Proxy端。Stub端:ActivityManagerService,  Proxy 端:ActivityManagerProxy

下面這個圖是以前分析AMS的時候一個框架圖,拿來用一下,就看紅框框的幾個類吧。

ActivityManagerProxy就是提供給客戶端的代理物件,客戶端可以通過這個代理,請求AMS的服務。那這個請求當然是通過它裡面的mRemote來發出的,這個mRemote當然也是BinderProxy啦。

ActivityManagerService繼承了ActivityManagerNative,大部分AMS的功能執行都是在這裡。

因為上面這兩個類都實現了同一個介面檔案IActivityManager,所以對客戶端來說,通過代理來呼叫函式,就像呼叫遠端服務一樣。

3.Application獲得AMS的Proxy

Application是怎麼得到AMS的Proxy的呢?這裡就要從程式碼開始看起了。

3.1 就看startActivity好了,跟蹤程式碼,最後會發現呼叫到ContexImpl中的:

/frameworks/base/core/java/android/app/ContextImpl.java

 public void startActivityAsUser(Intent intent, Bundle options, UserHandle user) {
ActivityManagerNative.getDefault().startActivityAsUser(...);
}

程式碼很簡單!但是這樣就可以呼叫AMS的服務了。

3.2 那來看一下這個getDefault()究竟是什麼:
/frameworks/base/core/java/android/app/ActivityManagerNative.java

    static public IActivityManager getDefault() {
return gDefault.get();
} private static final Singleton<IActivityManager> gDefault = new Singleton<IActivityManager>() {
protected IActivityManager create() {
IBinder b = ServiceManager.getService("activity"); (1)
IActivityManager am = asInterface(b); (2)
return am;
}
};

 說明:

(1):原來也是獲得了Activity service的IBinder,只是這個IBinder是從ServiceManager獲得的。實際上和RemoteService的情況一樣,這個IBinder實際上也是一個BinderProxy物件。

(2) 返回的是ActivityManagerProxy,裡面有個mRemote就是BinderProxy物件。

總結一下,上面這個過程可以概括的說是:
Application通過ServiceManager找到了AMS 的service代理物件,Application通過這個service代理物件也就可以和AMS通訊了。

那接下來的問題就是:

servicemanager其實也是一個另外的程序,Application是怎麼找到servicemanager的?或者說是怎麼拿到servicemanager的BinderProxy的呢?

請看下一篇。

Binder機制,從Java到C (3. ServiceManager in Java)