通過BluetoothA2DPService學習AIDL心得

本文想結合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)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章