本文想結合BluetoothA2DPService講述一下實現AIDL功能的方法,說的不對的地方,歡迎批評指正:)
1.BluetoothA2DPService的實現:
1)首先在SystemService代碼中我們看到
bluetoothA2dp = new BluetoothA2dpService(context);
ServiceManager.addService(BluetoothA2dpService.BLUETOOTH_A2DP_SERVICE, bluetoothA2dp);
這樣bluetoothA2dp這個實例就交給ServiceManager去管理了。
2)BluetoothA2DP類只是實現了BluetoothA2DPService的代理,並對其進行了一些擴展,但仍然通過下列代碼來獲取Service實例來操縱Service的各種功能:
IBinder b = ServiceManager.getService(BluetoothA2dpService.BLUETOOTH_A2DP_SERVICE);
if (b == null) {
throw new RuntimeException("Bluetooth A2DP service not available!");
}
mService = IBluetoothA2dp.Stub.asInterface(b);
3)此時Client端要實現遠程調用只能先創建BluetoothA2DP,當然也可以通過ApplicationContext的getSystemService方法獲取,但是目前的代碼中沒有實現,只能自己添加代碼了;)
2.通過上篇文章和A2DP部分代碼的學習,可以得出要實現AIDL功能的工作如下:
1)Service端:
a)編寫AIDL文件XXX.aidl,定義你要使用到的接口
b)使用makefile或者eclipse的ADT插件生成與之同名的JAVA文件XXX.java
c)聲明一個類繼承XXX.Stub,實現定義的接口功能
d)一般來說,爲了方便Client端使用,會寫一個類繼承Service,然後將實現Stub的類放在Service類的內部
2)Client端:
a)如果Service端是一個Android Service(extents Service),則要通過bindService和unbindService來和Service端建立連接或斷開連接,同時要聲明一個ServiceConnection類(bindService的時候用到),這樣連接成功的時候會在onServiceConnected(ComponentName name, IBinder service)中返回一個IBinder,然後調用XXX.Stub.asInterface(IBinder service)返回一個Service的實例,就可以通過該實例調用所有實現的接口了;
b)如果Service端不是一個Andoird Service實例,Client端可以通過ServiceManager的getService函數獲取IBinder,同樣調用XXX.Stub.asInterface(IBinder service)返回一個Service的實例。但是這種方式的前提是必須在該Service生成的時候通過ServiceManager的addService方法添加進去讓它去管理並賦予一個名稱,這樣獲取的時候直接指定名稱調用getService方法就可以得到你想要的Service了。比如IBinder b = ServiceManager.getService(Context.AUDIO_SERVICE)。
通過BluetoothA2DPService學習AIDL心得
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.