Messenger 进程间通信

Messenger

  使用 Messenger 可以在进程间传递数据, 实现一对多的处理. 其内部实现, 也是基于 aidl 文件, 这个aidl位于: frameworks/base/core/java/android/os/IMessenger.aidl.
  服务端与客户端通信, 主要是在传输的消息上做了处理, 让 Message.replyTo 指向的客户端的 Messenger, 而 Messenger 又持有客户端的一个 Binder 对象, 服务端正是利用这个 Binder 对象与客户端的通信.

1.服务端实现

  实现一个 Service 类, 定义处理消息的 Messenger 对象, 在 OnBind 时使用 Messenger 对象的 getBinder() 方法返回 Binder 对象.
  创建 Messenger 对象时, 使用一个 Handler 对象构造, 此 Handler 用于处理客户端发来的消息.
  如果服务端需要向客户端返回数据, 在 Message 对象中取出客户端的 Messenger 对象(Message 对象的 replyTo 参数), 向其发送消息即可.

    public class MyService extends Service {

        protected static final String TAG = "debug";

        private Messenger mMessenger = new Messenger(new MessengerHandler());

        @Override
        public IBinder onBind(Intent intent) {
            return mMessenger.getBinder();
        }

        private static class MessengerHandler extends Handler {
            @Override
            public void handleMessage(Message msg) {
                switch (msg.what) {
                case MsgConstants.MESSGE_FROM_CLIENT:
                    Log.d(TAG, "service get message");
                    Bundle data = msg.getData();
                    String msgContent = data.getString("msg");
                    Log.d(TAG, "" + msgContent);

                    // 回复客户端
                    Messenger client = msg.replyTo;
                    Bundle replyData = new Bundle();
                    replyData.putString("reply", "你的消息<" + msgContent +">,我已收到");
                    Message replyMsg = Message.obtain();
                    replyMsg.what = MsgConstants.MESSGE_FROM_SERVICE;
                    replyMsg.setData(replyData);
                    try {
                        client.send(replyMsg);
                    } catch (RemoteException e) {
                        Log.e(TAG, "", e);
                    }
                    break;
                default:
                    super.handleMessage(msg);
                    break;
                }
            }
        }
    }

    // AndoidManifest.xml 中注册服务
    <service
        android:name="com.example.MyService"
        android:exported="true"
        android:process=":remote" >
        <intent-filter>
            <action android:name="com.example.MyService" />
        </intent-filter>
    </service>

2.客户端实现

  首先需要 bindService, 成功时在 ServiceConnection 的 onServiceConnected() 方法中, 将传入 IBinder 对象构造一个 Messenger 对象, 此 Messager 对象用于向服务端发送消息.
  如果需要处理服务端返回的数据, 则还需要创建另外一个 Messenger 对象. 在向服务端发送数据时, 将 Message 对象的 replyTo 设置为该 Messenger 对象.

    // 连接 Service
    Intent service = new Intent("com.example.MyService");
    service.setComponent(new ComponentName("com.example", "com.example.MyService"));
    bindService(service, mConnection, Service.BIND_AUTO_CREATE);

    private Messenger mService;
    private Messenger mMessenger = new Messenger(new MessengerHandler());

    private static class MessengerHandler extends Handler {
        @Override
        public void handleMessage(Message msg) {
            Log.d(TAG, "client get message");
            switch (msg.what) {
            case MsgConstants.MESSGE_FROM_SERVICE:
                Bundle data = msg.getData();
                Log.d(TAG, "" + data.getString("reply"));
                break;
            default:
                super.handleMessage(msg);
                break;
            }
        }
    }

    private ServiceConnection mConnection = new ServiceConnection() {
        @Override
        public void onServiceDisconnected(ComponentName name) {
        }

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            mService = new Messenger(service);
        }
    };

    // 向服务端发送数据
    try {
        Message msg = Message.obtain();
        msg.what = MsgConstants.MESSGE_FROM_CLIENT;
        Bundle data = new Bundle();
        data.putString("msg", "kkkk");
        msg.setData(data);

        // 设置服务端回复的Messenger
        msg.replyTo = mMessenger;

        mService.send(msg);
    } catch (RemoteException e) {
        Log.e(TAG, "", e);
    }
时间: 2024-10-29 19:08:09

Messenger 进程间通信的相关文章

Android 进程间通信之Messenger

Android进程间通讯的方式 ? 当我们需要执行 IPC(进程间通信)时,一般有两种方式:AIDL和Messenger.关于AIDL的介绍请参看Android进程间通讯之AIDL.我们这里只介绍Messenger. ? 使用Messenger要比使用 AIDL 实现它更加简单,因为 Messenger 会将所有服务调用排入队列,而纯粹的 AIDL 接口会同时向服务发送多个请求,服务随后必须应对多线程处理.对于大多数应用,服务不需要执行多线程处理,因此使用 Messenger 可让服务一次处理一

Android开发中一些被冷落但却很有用的类和方法

MediaMetadataRetriever 顾名思义,就是用来获取媒体文件一些相关信息的类.包括一首歌的标题,作者,专辑封面和名称,时长,比特率等等.如果是视频的话,可以获取视频的长宽,预览图. http://developer.android.com/intl/zh-cn/reference/android/media/MediaMetadataRetriever.html TouchDelegate 用于更改View的触摸区域.场景:比如在RecyclerView的ItemView里包含了

【转】Android开发中让你省时省力的方法、类、接口

http://www.toutiao.com/i6362292864885457410/?tt_from=mobile_qq&utm_campaign=client_share&app=news_article&utm_source=mobile_qq&iid=6611409663&utm_medium=toutiao_android getParent().requestDisallowInterceptTouchEvent(true); 解释:一次点击事件是从父

Message的进程间通信 Messenger完全解析(what)

说到Android进程间通信,大家肯定能想到的是编写aidl文件,然后通过aapt生成的类方便的完成服务端,以及客户端代码的编写.如果你对这个过程不熟悉,可以查看Android aidl Binder框架浅析: 当然今天要说的通信方式肯定不是通过编写aidl文件的方式,那么有请今天的主角:Messenger.ok,这是什么样的一个类呢?我们看下注释 This allows for the implementation of message-based communication across p

Android应用进程间通信之Messenger信使使用及源码浅析

1 背景 这个知识点是个low货,刚开始其实想在之前一篇文章<Android异步消息处理机制详解及源码分析>一文中作为一个知识点分析的,但是想了又想又觉得该放在后面进程间通信分析时再分析.然并卵,还是单独拿出来写一篇分析一下吧. 提到Message和Handler其实大家都很熟悉,但是说到Messenger估计有些人还是不太常用的,更有甚者都能把Messenger拼写错误为Messager,以为是Message加了个r,当然,网络上对于Messenger的文章现在也很多了,但是个人分析总结总归

【Android】17.5 利用Messenger实现进程间通信(IPC)

分类:C#.Android.VS2015: 创建日期:2016-03-03 一.Messager类简介 本章前面曾经说过,要在Android上执行带服务的进程间通信(IPC),既可以用Messenger类来实现,也可以用更高级的AIDL技术来实现(AIDL:Android接口定义语言). 这一节我们学习首选的方案:用Messenger实现IPC的基本设计思路. IPC:进程间通信(Inter-process Communication). IPC with Service:带服务的进程间通信.

Android 基于Message的进程间通信 Messenger完全解析

一.概述 说到Android进程间通信,大家肯定能想到的是编写aidl文件,然后通过aapt生成的类方便的完成服务端,以及客户端代码的编写.如果你对这个过程不熟悉,可以查看Android aidl Binder框架浅析: 当然今天要说的通信方式肯定不是通过编写aidl文件的方式,那么有请今天的主角:Messenger.ok,这是什么样的一个类呢?我们看下注释 This allows for the implementation of message-based communication acr

【起航计划 036】2015 起航计划 Android APIDemo的魔鬼步伐 35 App-&gt;Service-&gt;Messenger Service Messenger实现进程间通信

前面LocalService 主要是提供同一Application中组件来使用,如果希望支持不同应用或进程使用Service.可以通过Messenger.使用Messgener可以用来支持进程间通信而无需使用AIDL. 下面步骤说明里Messenger的使用方法: 在Service中定义一个Handler来处理来自Client的请求. 使用这个Handler创建一个Messenger (含有对Handler的引用). Messenger创建一个IBinder对象返回给Client( onBind

IPC机制 用Messenger进行进程间通信

Messenger类可以在不同进程中传递Messge对象进行数据通信 Messenger是轻量级的IPC方案对AIDL进行了封装. 步骤: 1.在Service的onBind()方法中创建Messenger对象,并关联Handler private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case MSG_FROMCLIENT