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的主要内容,如果未能解决你的问题,请参考以下文章

android ipc通信机制之之三,进程通讯方式。

Android中的IPC方式—— Bundle文件共享Messenger

IPC机制总结

Android开发艺术探索——第二章:IPC机制(上)

20155202 张旭 Linux下IPC机制

IPC(中)