欢迎Follow我的GitHub: https://github.com/SpikeKing

本文的合集已经编著成书,高级Android开发强化实战,欢迎各位读友的建议和指导。在京东即可购买:https://item.jd.com/12385680.html

进程之间不能共享内存数据, 但是可以进行通信, 除了简单的Intent通信, 也可以使用Messenger, Messenger基于AIDL实现, 顺序执行, 不支持并发. 为了区分通信的始末, 我们暂定发送数据是客户端, 接收数据是服务端. 本文介绍Messenger的使用方式, 含有Demo.

更多: http://www.wangchenlong.org/

本文源码的GitHub下载地址


客户端

客户端发送数据到服务端, 服务端收到数据反馈回客户端.

接收反馈数据

MainActivity作为客户端, 发送信息. 首先创建消息的Handler类, 用于接收服务端的反馈, 继承Handler, 重写handleMessage方法, msg.what类型, msg.getData()数据.

private static class MessengerHandler extends Handler {private Context mContext;public MessengerHandler(Context context) {mContext = context.getApplicationContext();}@Override public void handleMessage(Message msg) {switch (msg.what) {case ParasConsts.MSG_FROM_SERVICE:String content = String.valueOf("客户端 - 收到信息: " + msg.getData().getString(ParasConsts.REPLY_ARG));Toast.makeText(mContext, content, Toast.LENGTH_SHORT).show();break;default:super.handleMessage(msg);break;}}
}

使用Handler创建Messenger.

mReplyMessenger = new Messenger(new MessengerHandler(getApplicationContext()));
// ...
msg.replyTo = mReplyMessenger;

连接服务发送数据

创建ServiceConnection类, 实现onServiceConnected方法. 创建信使Messenger, 创建消息Message, 在Message中添加序列化数据msg.setData(), 设置接收反馈msg.replyTo. Messenger发送数据send.

private ServiceConnection mConnection = new ServiceConnection() {@Override public void onServiceConnected(ComponentName name, IBinder service) {mMessenger = new Messenger(service);Message msg = Message.obtain(null, ParasConsts.MSG_FROM_CLIENT);Bundle data = new Bundle();data.putString(ParasConsts.MSG_ARG, "Hello, I'm Spike, your friends.");msg.setData(data);// 需要设置Reply的Messenger.msg.replyTo = mReplyMessenger;try {mMessenger.send(msg);} catch (RemoteException e) {e.printStackTrace();}}@Override public void onServiceDisconnected(ComponentName name) {}
};

注意信使: Messenger, 消息: Message, 拼写略有不同.

绑定服务

添加Connection, 使用Context.BIND_AUTO_CREATE, 绑定自动创建.

public void bindService(View view) {Intent intent = new Intent(this, MessengerService.class);bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
}

解绑服务unbindService.

public void unbindService(View view) {try {unbindService(mConnection);Toast.makeText(view.getContext(), "解绑成功", Toast.LENGTH_SHORT).show();} catch (Exception e) {e.printStackTrace();Toast.makeText(view.getContext(), "未绑定", Toast.LENGTH_SHORT).show();}
}

绑定服务一定需要解绑服务, 防止泄露. 如果没有注册, 解绑会发生异常.

服务端

服务端负责接收数据, 收到给客户端反馈.

MessengerService继承Service, 显示客户端消息msg.getData(). 反馈信息的Messenger使用客户端传递的, 创建消息添加内容, 使用客户端的Messenger传递给客户端.

处理与反馈数据

/*** 信使的持有, 处理返回信息*/
private static class MessengerHandler extends Handler {private Context mContext;public MessengerHandler(Context context) {mContext = context.getApplicationContext();}@Override public void handleMessage(Message msg) {switch (msg.what) {case ParasConsts.MSG_FROM_CLIENT:// 收到消息String content = String.valueOf("服务端 - 收到消息: "+ msg.getData().getString(ParasConsts.MSG_ARG));Toast.makeText(mContext, content, Toast.LENGTH_SHORT).show();// 回复消息Messenger client = msg.replyTo;Message reply = Message.obtain(null, ParasConsts.MSG_FROM_SERVICE);Bundle data = new Bundle();data.putString(ParasConsts.REPLY_ARG, "消息已经收到");reply.setData(data);// 发生Reply的信息try {client.send(reply);} catch (RemoteException e) {e.printStackTrace();}break;default:super.handleMessage(msg);}}
}

绑定接收数据

使用Handler创建服务端的Messenger

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

绑定Handler, 与客户端交流.

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

默认返回null.


客户端, 使用Messenger传递消息Message, Message中添加序列化数据Bundle; 服务端, 使用Handler解析获取的Message, 通过辨别类型, 获取数据. Messenger使用非常明晰, 易于控制, 是简单进程通信的首选.

OK, that’s all! Enjoy it!


最初发布地址:
http://www.wangchenlong.org/2016/05/17/1605/171-android-messenger/
欢迎Follow我的GitHub, 关注我的简书, CSDN, 掘金.
我已委托“维权骑士”为我的文章进行维权行动. 未经授权, 禁止转载, 授权或合作请留言.

Android 进程使用 Messenger 通信相关推荐

  1. Android进程使用Messenger通信

    进程之间不能共享内存数据, 但是可以进行通信, 除了简单的Intent通信, 也可以使用Messenger, Messenger基于AIDL实现, 顺序执行, 不支持并发. 为了区分通信的始末, 我们 ...

  2. android 进程间的通信,Android native进程间通信实例-binder结合共享内存

    在android源码的驱动目录下,一般会有共享内存的相关实现源码,目录是:kerneldriversstagingandroidashmem.c.但是本篇文章不是讲解android共享内存的功能实现原 ...

  3. Android 使用AIDL实现进程间的通信

    在Android中,如果我们需要在不同进程间实现通信,就需要用到AIDL技术去完成. AIDL(android Interface Definition Language)是一种接口定义语言,编译器通 ...

  4. [Android]你不知道的Android进程化(4)--进程通信AIDL框架

    Google爸爸,听说要将一些插件化hook系统的变量属性禁用,Android P之后很可能将会不再有插件化.热更新.主题变换.资源加固等骚操作.试图hook,你将会看到 NoSuchFieldExc ...

  5. 第十章 进程间的通信 之 Java/Android多线程开发(二)

    文章目录 (一)Java 多线程开发 1.1)线程状态 1.2)线程控制方法 (1.2.1)Synchronized (1.2.2)Volatile (1.2.3)ReentrantLock 1.3) ...

  6. 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 注入工具收尾操作 | 关闭注入的动态库 | 恢复寄存器 | 脱离远程调试附着 )

    文章目录 一.dlclose 函数简介 二.关闭注入的 libbridge.so 动态库 三.恢复寄存器 四.脱离远程调试附着 一.dlclose 函数简介 dlclose 函数的作用是 卸载一个 指 ...

  7. 【Android 逆向】Android 进程注入工具开发 ( SO 进程注入环境及 root 权限获取 | 进程注入时序分析 )

    文章目录 一.SO 进程注入环境及 root 权限获取 二.进程注入时序分析 一.SO 进程注入环境及 root 权限获取 SO 注入的前提必须有 root 权限 , 有了 root 权限后 , 才能 ...

  8. 【Flutter】Flutter 混合开发 ( Flutter 与 Native 通信 | Android 端实现 MethodChannel 通信 )

    文章目录 前言 一.Android 端 MethodChannel 构造函数 二.Android 端 setMethodCallHandler 方法 三.Android 端实现 MethodChann ...

  9. 【Flutter】Flutter 混合开发 ( Flutter 与 Native 通信 | Android 端实现 EventChannel 通信 )

    文章目录 前言 一.Android 端 EventChannel 构造函数 二.Android 端 setStreamHandler 方法 三.Android 端实现 EventChannel 通信步 ...

最新文章

  1. 纯css实现毛玻璃效果
  2. 「北京」「10-30k」「华米科技(小米手环)」招前端工程师
  3. 【正一专栏】孙杨累了就休息下吧!放弃也是一种完美!
  4. php自己总结的一些经典的实例
  5. Hessian之简单使用
  6. 在动态网络下实现分布式共享存储
  7. linux汇编字符长怎么看,linux – 在内联GNU汇编程序中获取字符串长...
  8. 数据结构与算法之间的关系
  9. Spring知识点总结-3
  10. Tesseract试用过程及结果分析
  11. Java中String转换int
  12. Django2.0中URL的路由机制
  13. voc2007目标检测数据集制作
  14. 小米笔记本pro lol测试软件,小米笔记本Pro 15增强版游戏性能测评
  15. Excel中数据截取
  16. echarts散列图示例
  17. Express的使用
  18. Mock-Server搭建
  19. 蓝桥杯省赛 砝码称重(B组)
  20. 全国最常用的password前10000名,里面可能有你的密码,快来看看吧

热门文章

  1. upper_bound()函数的使用
  2. 哪些因素会影响订货系统价格
  3. VMware安装Linux Ubuntu 16.04
  4. iOS实现HTTPS访问
  5. 让百度和头条撕逼的搜索引擎“保护费”,究竟保护了谁?
  6. html自定义动画让元素下落,jQuery实现的模仿雨滴下落动画效果
  7. 打印多张分页图片工具类
  8. 太难为我了,为了这份P7岗offer,我承受了7轮面试
  9. MySQL插入语句优化
  10. Unity3D开发入门教程(四)——用Lua实现组件