进程之间不能共享内存数据, 但是可以进行通信, 除了简单的Intent通信, 也可以使用Messenger, Messenger基于AIDL实现, 顺序执行, 不支持并发. 为了区分通信的始末, 我们暂定发送数据是客户端, 接收数据是服务端. 本文介绍Messenger的使用方式, 含有Demo.
更多: http://www.wangchenlong.org/
欢迎Follow我的GitHub: https://github.com/SpikeKing
本文源码的GitHub下载地址
客户端
客户端发送数据到服务端, 服务端收到数据反馈回客户端.
接收反馈数据
MainActivity作为客户端, 发送信息. 首先创建消息的Handler类, 用于接收服务端的反馈, 继承Handler
, 重写handleMessage
方法, msg.what
类型, msg.getData()
数据.
1 | private static class MessengerHandler extends Handler { |
使用Handler创建Messenger.
1 | mReplyMessenger = new Messenger(new MessengerHandler(getApplicationContext())); |
连接服务发送数据
创建ServiceConnection
类, 实现onServiceConnected
方法. 创建信使Messenger
, 创建消息Message
, 在Message中添加序列化数据msg.setData()
, 设置接收反馈msg.replyTo
. Messenger发送数据send
.
1 | private ServiceConnection mConnection = new ServiceConnection() { |
注意信使: Messenger, 消息: Message, 拼写略有不同.
绑定服务
添加Connection, 使用Context.BIND_AUTO_CREATE
, 绑定自动创建.
1 | public void bindService(View view) { |
解绑服务unbindService.
1 | public void unbindService(View view) { |
绑定服务一定需要解绑服务, 防止泄露. 如果没有注册, 解绑会发生异常.
服务端
服务端负责接收数据, 收到给客户端反馈.
MessengerService继承Service, 显示客户端消息msg.getData()
. 反馈信息的Messenger
使用客户端传递的, 创建消息添加内容, 使用客户端的Messenger传递给客户端.
处理与反馈数据
1 | /** |
绑定接收数据
使用Handler创建服务端的Messenger
1 | mMessenger = new Messenger(new MessengerHandler(getApplicationContext())); |
绑定Handler, 与客户端交流.
1 | public IBinder onBind(Intent intent) { |
默认返回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, 掘金.
我已委托“维权骑士”为我的文章进行维权行动. 未经授权, 禁止转载, 授权或合作请留言.