Binder通信機制更高級的寫法

通過操作ServiceManager.addService (String name, IBinder service)方法,可以在service端註冊多個binder通信服務。如下:

ServiceManager.addService(BT_MUCIS_SERVICE, BtMusicService.getInstance());
ServiceManager.addService(BT_PHONE_SERVICE, BtPhoneService.getInstance());
ServiceManager.addService(BT_CONNECT_SERVICE, BtConnectService.getInstance());
                
public class BtMusicService extends IBtMediaCtrl.Stub{  
........           

當然,ServiceManager相關的類並沒有開放給開發者,需要framework的同事開放一下jar包,或者是用反射的方式。客戶端就可以使用反射的方式綁定遠程binder。

 Object obj = new Object();
 java.lang.reflect.Method method;
 try {
       method = Class.forName("android.os.ServiceManager").getMethod("getService", String.class);
       IBinder binder = (IBinder) method.invoke(obj, BT_MUSIC_SERVICE);
       if(null == binder) {
            return null;
         }
       binder.linkToDeath(new IBinder.DeathRecipient() {
          @Override
          public void binderDied() {
                  resetMsgManager(); //重連機制
              }
          }, 0);
       IBtMusicManager musicService = IBtMusicManager.Stub.asInterface(binder);
           return musicService ;
      } catch (Exception e) {
            e.printStackTrace();
    }
      return null;

如果服務端和客戶端涉及到的邏輯比較多,binder連接比較多的情況下,用此種方式連接會比較清晰,且可以實現服務重連的機制。

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