分两种情况,同进程与不同进程情况下。
同进程情况下:
继承Binder类,在onBind方法中返回
MyBinder binder = new MyBinder(); public class MyBinder extends Binder { public LocalService getIntance(){ return LocalService.this; } } @Override public IBinder onBind(Intent intent) { return binder; }
public void onServiceConnected(ComponentName name, IBinder service) { LocalService.MyBinder myBinder = (LocalService.MyBinder) service; localService = myBinder.getIntance(); }
不同进程情况下:
1.用aidl
IRemoteServiceAidlInterface.Stub stub = new IRemoteServiceAidlInterface.Stub() { @Override public String getProcessInfo() throws RemoteException { String result= "pid:"+android.os.Process.myPid()+"uid:"+android.os.Process.myUid()+"tid:"+android.os.Process.myTid(); return result; } }; @Override public IBinder onBind(Intent intent) { return stub; }
public void onServiceConnected(ComponentName name, IBinder service) { iRemoteServiceAidlInterface = IRemoteServiceAidlInterface.Stub.asInterface(service); try { remote_info.setText(iRemoteServiceAidlInterface.getProcessInfo()); } catch (RemoteException e) { e.printStackTrace(); } }
2.用messenger实现。我们知道handler能实现线程间通讯,messenger是结合了handler与aidl实现进程间通讯的。
Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { switch (msg.what){ case IsServiceActivityInOneThread.CONNECTED: Messenger messenger = msg.replyTo; Message message = Message.obtain(); message.what = IsServiceActivityInOneThread.CONNECTED; message.obj = new MyObject(getProcessInfo()); try { messenger.send(message); } catch (RemoteException e) { e.printStackTrace(); } break; } } }; Messenger messenger = new Messenger(handler); @Override public IBinder onBind(Intent intent) { return messenger.getBinder(); }
Messenger cMessenger = new Messenger(new android.os.Handler(){ @Override public void handleMessage(Message msg) { messenger_remote_info.setText(msg.obj+"--"); } });
public void onServiceConnected(ComponentName name, IBinder service) { sMessenger = new Messenger(service); try { Message message= Message.obtain(); message.what = CONNECTED; message.replyTo = cMessenger; sMessenger.send(message); } catch (RemoteException e) { e.printStackTrace(); } }
用此方法感觉异常繁琐,双向通讯需要两个messenger(也意味着维护两个handler),message传递数据还需要parcelable,跨进程parcelable还会报这个错误 E/Parcel : Class not found when unmarshalling 暂时还没解决这个问题,后续有空再看。