基于消息的进程间通信的方式,不需要编写aidl文件,使用更加简单方便。
客户端和服务端都用Messenger来发送数据,用Handler来处理数据。Messenger处理数据依靠Handler,所以是串行的,也就是说,Handler接到多个message时,就要排队依次处理。
可实现一对多的通信,甚至可以作为一个转接处,任意两个进程都能通过服务端进行通信。
通信实例,一般通过两个apk程序演示,一个apk是Server端,一个是Client端。
服务端:
1.一般继承Service
2.需要去声明一个Messenger对象mMessenger,参数为Handler,要实现Handler的handleMessage方法
private Messenger mMessenger = new Messenger(new Handler(){@Overridepublic void handleMessage(Message msgfromClient){//处理客户端的消息Message msgToClient = Message.obtain(msgfromClient);//返回给客户端的消息//...省略处理逻辑//将处理结果返回给客户端msgfromClient.replyTo.send(msgToClient);super.handleMessage(msgfromClient);}});
3.Service的onBind方法返回mMessenger.getBinder()
@Overridepublic IBinder onBind(Intent intent){return mMessenger.getBinder();}
客户端:
1.一般是Activity,因为要以bindService(intent, mConn, Context.BIND_AUTO_CREATE)连接远程服务
2.有两个Messenger对象,一个(mMessenger)用以处理接收到的服务端的消息,一个(mService)是服务端对象
private Messenger mMessenger = new Messenger(new Handler(){@Overridepublic void handleMessage(Message msgFromServer){//... 处理服务器的消息,可做UI显示 super.handleMessage(msgFromServer);}});
3.首先bindService,然后在onServiceConnected中拿到回调的service(IBinder)对象,通过service对象去构造一个mService = new Messenger(service);然后就可以使用mService.send(msg)给服务端了
private ServiceConnection mConn = new ServiceConnection(){@Overridepublic void onServiceConnected(ComponentName name, IBinder service){mService = new Messenger(service);isConn = true;}@Overridepublic void onServiceDisconnected(ComponentName name){mService = null;isConn = false;}};
4.向服务端发送消息
Message msgFromClient = Message.obtain();msgFromClient.replyTo = mMessenger;mService.send(msgFromClient);