IPC机制--Messager

Messager是一种轻量级的IPC方案,它的底层实现AIDL,由于他一次处理一个请求,因此在服务端不用考虑线程同步问题
1.服务端继承
首先,在服务端创建一个Service来处理客户端请求,同时创建一个Handle并通过他来创建一个Messager对象,然后在Service的onBind中返回这个Messager对象底层的Binder即可
2.客户端进程
首先要绑定服务端的Service,绑定成功后用服务端返回的IBinder对象创建一个Messager,通过这个Messager就可以像服务端发送消息,消息类型为Message对象。如果需要服务端能够回应客户端,就和服务端一样,还需创建一个Handler并创建一个新的Messager,并把这个Messager通过Message的replyTo参数传递给服务端,服务端通过这个replyTo参数就可以回应客户端

eg
public class MessagerService extends Service{
  private static final String TAG = "MessagerService";
  private static class MessagerHandle extends Handler{
      @override
      public void handleMessage(Message msg){
          switch(msg.what){
             case MyConsts.MSG_FROM_CLIENT:
                 Log.i(TAG,"receive msg from Client:" + mag.getData().getString("msg"));
                 Messager client = msg.replyTo;
                 Message replyMessage = Message.obtain(null,MyConstants.MSG_FROM_SERVICE);
                 Bundle bundle = new Bundle();
                 bundle.putString("reply","dddddd")
                 replyMessage.setData(bundle);
                 try{
                      client.sent(replyMessage);
                 }catch{
                     e.printStackTrace();
                 }
                 break;
            default:
                 sper.handleMessage(msg);
          }
      }
  }
  private final Messager mMessager = new Messager(new MessagerHandler());
  @override
  public IBinder onBind(Intent intent){
    return mMessager.getBinder();
  }
}

public class MessagerActivity extands Activity{
  private static final String TAG = "MessagerActivity";
  private Messager mService;
  private Messager mGetReplyMessager = new Messager(new MessagerHandler());
  private static class MessagerHandler extends Handler{
      @override
      public void handleMessage(Message msg){
         switch(msg.what){
              case MyConstants.MSG_FROM_SERVICE:
                      Log.i(TAG,"receiver msg from service:",msg.getData().getString("reply"));
              default:
                      super.handleMessage(msg);
         }
      }
  }
  private ServiceConnection mConnection = new ServiceConnection(){
      public void onServiceConnection(ComponentName className,IBinder service){
         mSerice = new Messager(service);
         Message msg = Message.obtain(null,MyConnections.MSG_FROM_FROM);
         Bundle data = new Bundle();
         data.putString("msg","hellow,this is client");
         mag.setData(date);
         msg.replyTo = mGetReplyMessager  ;
         try{
             mService.send(msg);
         }catch(RemoteException e){
            e.printStackTrack();
         }
      }
     public void onServiceDisconnected(Conponement className){
         
     }
  }
  @override
  protected void onCreate(Bundle saveInstanceState){
     super.onCreate(saveInstaceState);
     setContentView(R.layout.activity_messenger);
     Intent intent = new Intent(this,MessagerService);
     bindService(intent,mConnection,Contenxt.BIND_AUTO_CREATE);
  }
  @override
  protected void onDestory(){
    unbindService(mConnection);
    super.onDestory();
  }
}
Message中能够使用的载体只有what1,what2,args2,Bundle以及replyTO,Message中海还有另外一个字段object,但是在Android2.2以前object字段不支持跨进程传输,这意味着,我们自定义的Parcelable对象是无法通过object字段来传输的

你可能感兴趣的:(IPC机制--Messager)