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 Activity,start Service,send 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)