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连接比较多的情况下,用此种方式连接会比较清晰,且可以实现服务重连的机制。

你可能感兴趣的:(Android小技巧)