IPC机制——使用Bundle文件共享Messenger
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IPC机制——使用Bundle文件共享Messenger相关的知识,希望对你有一定的参考价值。
两种较为简单的进程间通信方式。
一、使用Bundle
最简单的进程间通信方式,可直接利用Intent传递Bundle对象(Activity、Service、Receiver),Bundle支持基本数据类型以及序列化对象。
一种典型应用场景,当需要传递一计算结果至另一进程时,由于结果不支持使用Bundle直接传输,而其他IPC方法又过于复杂。此时可通过Intent启动另一进程的Service组件用于执行计算过程,计算结果可直接传输给统一进程内的目标组件。
二、使用文件
通过读写同一文件实现进程间通信,读写序列化对象的过程很简单,不赘述。
三、使用Messenger
通过Messenger对象在不同进程中传递Message对象,在Message中放入我们需要传递的数据。其底层实现为AIDL。由于其一次处理一个要求,在服务端我们不需要考虑线程同步的问题,因为不存在并发执行的情形。
Messenger的实现分为两部分。
1、服务端进程
创建一个Service处理客户端的连接请求,同时创建一个Handler并通过它来创建一个Messenger对象,然后在Service的onBind方法中返回Messenger对象底层的Binder对象即可。其中在Handle中复写handleMessage方法用于处理客户端发送的信息以及向客户端发送信息。通过message.replyTo获得客户端返回的Messenger对象用于向客户端发送信息。
private static class MessengerHandle extends Handler{ //消息处理方法,用于处理客户端发送的信息 @Override public void handleMessage(Message msg) { switch (msg.what){ case 1: //取出客户端发送信息 Log.d(TAG,"receive msg from Client:"+msg.getData().getString("msg")); //获得客户端返回的Messenger对象,用于向客户端发送信息 Messenger client = msg.replyTo; //创建Message对象 Message replyMessage = Message.obtain(null,2); Bundle data = new Bundle(); data.putString("reply","信息已收到"); replyMessage.setData(data); try { //向客户端发送信息 client.send(replyMessage); }catch (RemoteException e){ e.printStackTrace(); } break; default: super.handleMessage(msg); Log.d(TAG,"receive msg from Client:"+msg.getData().getString("msg")); } } }
创建Messenger对象并在onBind中返回Binder对象
private final Messenger messenger = new Messenger(new MessengerHandle()); @Override public IBinder onBind(Intent intent) { // TODO: Return the communication channel to the service. return messenger.getBinder(); }
2、客户端进程
与服务端类似,创建Handler对象用于处理服务端发送的信息。创建ServiceConnection实现与Service的通信,获得Service返回的Binder对象,并由此创建Messenger对象。
mService = new android.os.Messenger(service);
发送信息的实现与服务端类似。需要注意的是在向服务端发送信息时,指定message.repleTo对象传输客户端的Messenger对象用于服务端返回信息。
msg.replyTo = messenger;
Messenger工作原理
以上是关于IPC机制——使用Bundle文件共享Messenger的主要内容,如果未能解决你的问题,请参考以下文章