赞
踩
基于消息的进程间通信的方式,不需要编写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(){
- @Override
- public void handleMessage(Message msgfromClient){
- //处理客户端的消息
- Message msgToClient = Message.obtain(msgfromClient);//返回给客户端的消息
-
- //...省略处理逻辑
-
- //将处理结果返回给客户端
- msgfromClient.replyTo.send(msgToClient);
-
- super.handleMessage(msgfromClient);
- }
- });
3.Service的onBind方法返回mMessenger.getBinder()
- @Override
- public 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(){
- @Override
- public 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(){
- @Override
- public void onServiceConnected(ComponentName name, IBinder service){
- mService = new Messenger(service);
- isConn = true;
- }
-
- @Override
- public void onServiceDisconnected(ComponentName name){
- mService = null;
- isConn = false;
- }
- };
4.向服务端发送消息
- Message msgFromClient = Message.obtain();
- msgFromClient.replyTo = mMessenger;
- mService.send(msgFromClient);
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。