AIDL

AIDL

使用時機: 在不同的thread要進行IPC時, 比如在不用的app底下,想取得在別的process執行的service

但其他情況:

在同一個app中做IPC,則使用binder即可。

若一個service,不需要用multi-threading處理事情時,就選用Messenger來實作介面。

使用AIDL的介面,主要有3個步驟:

1.建立.aidl 檔案(ex. IBluetoothHeadset.aidl),然後經過aidl.exe會產出java檔案

2.實作介面(aidl file中所定義的methods)(ex. BluetoothHeadset.java)

3.Expose the interface to clients

繼承Service,並實作onBind()

但在BluetoothService的實際作法是BluetoothService extends IBluetooth.Stub

就可把BluetoothService變成「Remotable Object」(即BpBinder),(而用binder的話,寫法是直接extends Binder)

一旦成為Remotable Object,就可讓有實作binder的Remote Object與它作IPC的溝通。

以下是取得service的source code,

IBinder mBinder = ServiceManager.getService(name);  
IXXXService service = IXXX.Stub.asInsterface(mBinder);//若是在非同一個process呼叫,才會return remote boject(BpBinder), 否則會return native binder, 即BnBinder  

使用IBluetooth.Stub.asInsterface(mBinder)可取得BluetoothService的分身(proxy object),其實就是透過這個proxy object與remote object溝通。而service是呼叫ServiceManager.getService(name),由ServiceManager,在存放服務與IBinder的HashMap中,以name去找到該service的IBinder,再回傳。以bluetooth為例,即為ServiceManager.getService(“bluetooth”);

而再深入去看,發現asInsterface()中,由IBluetooth.Stub.Proxy()去取得proxy object。

public static android.bluetooth.IBluetooth asInterface(IBinder obj) {  
…  
return new IBluetooth.Stub.Proxy(obj);  
}