通過操作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連接比較多的情況下,用此種方式連接會比較清晰,且可以實現服務重連的機制。