Binder是一種架構,包含服務端接口、Binder驅動、客戶端接口三個模塊。
Binder服務端,實際上就是一個Binder類的對象。該對象一旦創建,內部會啓動一個隱藏線程 ,該線程負責接收Binder驅動發送來的消息。
Binder驅動中包含一個Binder mRemote對象,在服務端對象創建時相應創建。
mRemote對象重載了transact(),實現了IPC通信:
1、向服務端線程發送調用消息
2、掛起當前線程,等待服務端執行完畢後的通知
3、接收到服務端線程的通知,然後執行客戶端的線程
應用程序客戶端想要訪問遠程服務,首先需要得到一個Binder對象。
如何獲取Binder對象?
Android的組件之一Service也是基於Binder來實現的,只是進行了一系列封裝,方便我們使用。接下我們就可以通過bindService()方法來獲取到Binder對象。
ContextImpl調用bindService()方法,ActivityManagerService會調用scheduleBindService(),接着回調ServiceConnection的OnBind()方法,將Binder對象傳遞給客戶端。
Binder對象有兩個,一個是服務端的,一個是Binder驅動中的,到底返回的是哪個呢?
如果客戶端和服務端在同一進程,則直接返回服務端中的Binder對象,否則返回Binder驅動中的Binder對象,由mRemote對象負責進程間的通信。
AIDL工具的使用
Android中提供了一個aidl工具,可能把aidl文件轉換成一個Java類文件。該Java類文件重載了transact()和onTransact()方法,將客戶端和服務端通信的方法都封裝好了。客戶端可以像使用其他普通類對象一樣調用服務端的方法。
AIDL具體實現的功能
1、定義了一個接口,包含aidl文件所聲明的通信函數
2、定義一個Proxy類,作爲客戶端訪問服務端的代理,實現好了寫入的方法
3、定義一個Stub類,基於Binder,重載了onTransact()方法,實現了取出的方法