使用Messenger的IPC
2016-01-28 11:06
351 查看
以下是个人理解,错的地方希望指正出来,谢谢。
想要跨进程的通讯,有两种方法,一种是使用aidl,这个前面文章有提到。
还有一种是使用Messenger对象,这个对象实现了Parcelable接口。
在服务端的Service中我们要先实例化一个Messenger对象,传入一个Handler,并且重写handleMessage方法,用来处理客户端发来的消息。
然后在onBind方法中返回mMessenger.getBinder();
之后是客户端,客户端想要与之通讯,必须持有服务端的IBinder。
bindService的ServiceConncetion中拿到Messenger对象,可以使用实例化Messenger,把IBinder做参数传入。
实际上在实例化Messenger时,我们客户端持有的是远程的Binder,只是Android系统帮我们拿到了aidl接口。
拿到mMessenger时,就可以mMessenger.send(Message msg);实现通讯了。
那我们应该怎样让服务端来返回数据呢?
我们可以在send之前,让msg.replyTo=Messenger;这是一个新得实例化的Messenger,用来接收服务端的数据,和obj的使用时一样的。
在服务端就可以通过msg.replyTo拿到客户端的Messenger,之后就可以通过Messenger.send();把数据返回给我们的客户端,以达到双向通讯的效果。
而前面说到,我们如果想要发送数据到服务端,使用msg.obj是会出异常的,所以我们必须使用实现parcelable接口的方法来传递数据,还没有搞懂,稍后传上去。
想要跨进程的通讯,有两种方法,一种是使用aidl,这个前面文章有提到。
还有一种是使用Messenger对象,这个对象实现了Parcelable接口。
在服务端的Service中我们要先实例化一个Messenger对象,传入一个Handler,并且重写handleMessage方法,用来处理客户端发来的消息。
然后在onBind方法中返回mMessenger.getBinder();
之后是客户端,客户端想要与之通讯,必须持有服务端的IBinder。
bindService的ServiceConncetion中拿到Messenger对象,可以使用实例化Messenger,把IBinder做参数传入。
实际上在实例化Messenger时,我们客户端持有的是远程的Binder,只是Android系统帮我们拿到了aidl接口。
拿到mMessenger时,就可以mMessenger.send(Message msg);实现通讯了。
那我们应该怎样让服务端来返回数据呢?
我们可以在send之前,让msg.replyTo=Messenger;这是一个新得实例化的Messenger,用来接收服务端的数据,和obj的使用时一样的。
在服务端就可以通过msg.replyTo拿到客户端的Messenger,之后就可以通过Messenger.send();把数据返回给我们的客户端,以达到双向通讯的效果。
而前面说到,我们如果想要发送数据到服务端,使用msg.obj是会出异常的,所以我们必须使用实现parcelable接口的方法来传递数据,还没有搞懂,稍后传上去。
相关文章推荐
- Android IPC进程间通讯机制
- MSN Messenger 化繁为简(用 Visual Studio 2005 去掉 MSN 广告)
- android使用Messenger绑定Service的多种实现方法
- ipc通道入侵相关命令整理
- PHP实现连接设备、通讯和发送命令的方法
- Linux IPC命令的用法详解
- C#窗体间通讯处理的几种方法总结
- flash javascript之间的通讯方法小结
- C#窗体间通讯的几种常用处理方法总结
- Linux进程通信(IPC)方式简介
- php实现与erlang的二进制通讯实例解析
- Android应用程序四大组件之使用AIDL如何实现跨进程调用Service
- 基于Android AIDL进程间通信接口使用介绍
- Android 使用【AIDL】调用外部服务的解决方法
- Android程序设计之AIDL实例详解
- 前端交互消息显示插件 jQuery Messenger(基于jQuery)
- Linux进程间通信(IPC)方式总结
- Android IPC 机制【1】--简介
- 序列化接口:Serializable 、Parcelable
- Android IPC 机制【2】--- Messenger[1]