Messenger 作为一个跨进程通信工具,它可以让你通过互相传递 Message 来进行跨进程数据交互共享。对于Android来说,Messenger是一个轻

量级的 IPC 方案,内部对 AIDL 进行了封装。它的实现较之 AIDL 方式也更为容易。

1、创建我们的服务端 WorkService :

import android.app.Service;import android.content.Intent;import android.os.Bundle;import android.os.Handler;import android.os.IBinder;import android.os.Message;import android.os.Messenger;import android.os.RemoteException;import android.util.Log;public class WorkService extends Service {        public static final int MSG_FROM_CLIENT = 101;    private Handler workHandler = new Handler() {        @Override        public void handleMessage(Message msg) {            super.handleMessage(msg);            switch (msg.what) {                case MSG_FROM_CLIENT:                    Bundle bundle = msg.getData();                    //打印接收到的客户端信息                    Log.d("RJie", "WorkService: " + bundle.getString("msg"));                    //通过 msg 的 msg.replyTo 得到客户端传来的 Messenger 对象                    Messenger workMessenger = msg.replyTo;                    Message serviceMsg = Message.obtain(null, WorkService.MSG_FROM_CLIENT);                    Bundle serviceBundle = new Bundle();                    serviceBundle.putString("rep", "收到,客户端你好,这里是服务端!!!");                    serviceMsg.setData(serviceBundle);                    try {                        //发送消息给客户端                        workMessenger.send(serviceMsg);                    } catch (RemoteException e) {                        e.printStackTrace();                    }                    break;            }        }    };    @Override    public IBinder onBind(Intent intent) {        //通过接收消息的 Handler 来获取 Binder 对象        return new Messenger(workHandler).getBinder();    }}
2、在清单文件中注册服务:android:process 必须给值 让服务端与客户端运行在不同的进程 “:” 表示项目包名 后面的值任意

             
3、客户端代码:

import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.content.ServiceConnection;import android.os.Bundle;import android.os.Handler;import android.os.IBinder;import android.os.Message;import android.os.Messenger;import android.os.Process;import android.os.RemoteException;import android.support.v7.app.AppCompatActivity;import android.util.Log;public class MainActivity extends AppCompatActivity {    //声明一个 Handler 对象来接收服务端发送来的消息    private Handler mainHandler = new Handler() {        @Override        public void handleMessage(Message msg) {            super.handleMessage(msg);            switch (msg.what) {                case WorkService.MSG_FROM_CLIENT:                    Log.d("RJie", "MainActivity: " + msg.getData().getString("rep"));                    break;            }        }    };    private Messenger mainMessenger;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //打印出 UI 线程所在进程的id        Log.d("RJie", "MainActivity.pid==" + Process.myPid());        //绑定服务端        Intent workServiceIntent = new Intent(MainActivity.this, WorkService.class);        bindService(workServiceIntent, sc, Context.BIND_AUTO_CREATE);    }    //声明一个 ServiceConnection 来对客户端与服务端的连接后业务进行处理    private ServiceConnection sc = new ServiceConnection() {        @Override        public void onServiceConnected(ComponentName name, IBinder service) {            //通过 IBinder 对象创建一个 Messenger 对象            mainMessenger = new Messenger(service);            Message mainMessage = Message.obtain(mainHandler, WorkService.MSG_FROM_CLIENT);            Bundle mainBundle = new Bundle();            mainBundle.putString("msg", "这里是客户端,听到请回答!!!");            mainMessage.setData(mainBundle);            //将 Messenger 对象传递给服务端            mainMessage.replyTo = new Messenger(mainHandler);            try {                //发送消息给服务端                mainMessenger.send(mainMessage);            } catch (RemoteException e) {                e.printStackTrace();            }        }        @Override        public void onServiceDisconnected(ComponentName name) {        }    };    @Override    protected void onDestroy() {        super.onDestroy();        //解绑服务端        unbindService(sc);    }}
运行结果:

06-16 20:18:54.907 3668-3668/? D/RJie: MainActivity.pid==366806-16 20:18:54.987 3688-3688/? D/RJie: WorkService.pid==368806-16 20:18:55.057 3688-3688/? D/RJie: WorkService: 这里是客户端,听到请回答!!!06-16 20:18:55.110 3668-3668/? D/RJie: MainActivity: 收到,客户端你好,这里是服务端!!!

到这,简单的 Messenger 使用就完成了。





更多相关文章

  1. Android中的网络编程系列(一):URLConnection
  2. Android的Http网络请求模型初步
  3. Android(安卓)Audio底层原理(二)
  4. Unity 与 Android(安卓)aar 包通讯
  5. Android客户端每周自动化回归报告
  6. 开源中国-android客户端源代码阅读1
  7. Data Binding(数据绑定)用户指南
  8. Android(安卓)TextView中文字设置超链接、颜色、字体
  9. python服务器与android客户端socket通信实例

随机推荐

  1. Android笔记 - Android启动之Launcher启
  2. android启动画面
  3. Android(安卓)textview实现删除线
  4. [置顶] Android View系统学习文章汇总
  5. Android知识积累
  6. Android 4.3新特性——SElinux简介
  7. ubuntu16.10 AndroidStudio创建Virtual D
  8. Hybrid App开发问题记录
  9. android中设置全屏的方法
  10. Button、选择框、日期、时间控件