码迷,mamicode.com
首页 > 其他好文 > 详细

IPC机制——使用Bundle、文件共享、Messenger

时间:2017-03-26 17:17:15      阅读:188      评论:0      收藏:0      [点我收藏+]

标签:利用   问题   bundle   try   读写   创建   reply   http   序列化   

两种较为简单的进程间通信方式。

一、使用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

标签:利用   问题   bundle   try   读写   创建   reply   http   序列化   

原文地址:http://www.cnblogs.com/androidlu/p/6623241.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!