IPC机制---04 Android中的IPC通讯方式(A)
2016-01-31 22:51
399 查看
使用Bundle
Android四大组件中的三大组件(Activity Service Receiver)都支持在intent中传递Bundle数据,Bunder实现了Parcelable接口,所以它方便在不同的进程间传输。
当我们在一个进程中启动了另一个进程的Activity Service Receiver,我们就可以在Bundle中附近我们需要传输的数据,并通过Intent发送出去,当然,数据必须能够被序列化。
使用文件共享
文件共享是一种不错的线程间通讯方式,两个进程通过读写同一个文件来实现数据共享。
比如A把数据写入文件,B进程通过读取这个文件获取数据。Android基于Linux,所以就不存在Windows下排斥锁的问题。
除了交换文本信息外,还可以序列化一个对象到文件中,另一个进程通过对改文件进行反序列化来获取数据
对文件格式没有要求,双方约定好即可。存在一定的局限性,比如并发读写等。适合在对数据同步要求不高的线程之间进行通信,并要处理好并发读写的问题
SP是一个特例,android提供的轻量级存储方案,通过键值对方式存储数据。属于文件的一种,但是系统对它的读写有一定的缓存策略,也就是说在内存中会有一份SP文件的缓存,因此,在多进程模式下,系统对它的读写就变得不靠谱,很大概率上会丢失数据,不建议进程间通讯使用
使用Messenger
信使,通过它可以在不同进行之间传递message对象,在Message中放入我们需要传递的数据,就可以轻松实现数据的进程间通讯
一种轻量级IPC实现,底层实现就是AIDL,通过它的两个构造方法就可以看出来了
Messenger的使用方法很简单,他对AIDL做了封装,一次只处理一个请求,所以在服务端不用考虑线程同步问题
实现步骤如下,氛围服务端和客户端
a. 服务端进程
在服务端创建一个Service来处理客户端的请求,同时创建一个Handler并通过他来创建一个Messenger对象,然后再Service的onBind返回这个Messenger对象底层的Binder即可,代码如下:
b.客户端进程
首先绑定服务端的Service,绑定成功后用服务端返回的IBinder对象创建一个Messenger,通过这个Messenger就可以向服务端发送消息了,消息类型为Message对象。
如果需要服务端能够回应客户端,就和服务端一样,还需要创建一个Handler对象并创建一个新的Messenger,并把这个Messenger对象通过Message的replyTo参数传递给服务端,服务端通过这个replyTo参数就可以回应客户端。
下面为不需要服务端返回数据的demo
Service代码如下
客户端代码
此外,还有一种case,就是服务端与客户端产生交互,服务端在收到客户端消息的时候,也给客户端发送一条消息,完整代码如下
客户端
创建一个Handler对象,并用他来创建一个客户端的Messenger对象,将这个clientMessenger对象以Message的replyTo形式发送个服务端。
代码如下:
服务端
接收Message的replyTo对象,也就是客户端的Messenger对象,然后创建Bundle,填充数据,最后通过clientMessenger对象将消息发送出去
代码如下
查看Log日志,可以发现可以实现正常通信,如下:
上面简单介绍了IPC通讯的三种方式,各有优缺点,Messenger看起来是挺强大的,但是也存在一定的不足,这个在下一篇中进行说明,并且下一篇将着重讲解AIDL的使用及注意事项。
注:
有人觉得demo都是在同一个应用,而没有针对不同应用,说明一下,这样选择在同一个应用内进行进程间通信,因为操作起来比较方便,与两个应用进行进程间通信是一样的,没有本质区别的。
Android四大组件中的三大组件(Activity Service Receiver)都支持在intent中传递Bundle数据,Bunder实现了Parcelable接口,所以它方便在不同的进程间传输。
当我们在一个进程中启动了另一个进程的Activity Service Receiver,我们就可以在Bundle中附近我们需要传输的数据,并通过Intent发送出去,当然,数据必须能够被序列化。
使用文件共享
文件共享是一种不错的线程间通讯方式,两个进程通过读写同一个文件来实现数据共享。
比如A把数据写入文件,B进程通过读取这个文件获取数据。Android基于Linux,所以就不存在Windows下排斥锁的问题。
除了交换文本信息外,还可以序列化一个对象到文件中,另一个进程通过对改文件进行反序列化来获取数据
对文件格式没有要求,双方约定好即可。存在一定的局限性,比如并发读写等。适合在对数据同步要求不高的线程之间进行通信,并要处理好并发读写的问题
SP是一个特例,android提供的轻量级存储方案,通过键值对方式存储数据。属于文件的一种,但是系统对它的读写有一定的缓存策略,也就是说在内存中会有一份SP文件的缓存,因此,在多进程模式下,系统对它的读写就变得不靠谱,很大概率上会丢失数据,不建议进程间通讯使用
使用Messenger
信使,通过它可以在不同进行之间传递message对象,在Message中放入我们需要传递的数据,就可以轻松实现数据的进程间通讯
一种轻量级IPC实现,底层实现就是AIDL,通过它的两个构造方法就可以看出来了
Messenger的使用方法很简单,他对AIDL做了封装,一次只处理一个请求,所以在服务端不用考虑线程同步问题
实现步骤如下,氛围服务端和客户端
a. 服务端进程
在服务端创建一个Service来处理客户端的请求,同时创建一个Handler并通过他来创建一个Messenger对象,然后再Service的onBind返回这个Messenger对象底层的Binder即可,代码如下:
b.客户端进程
首先绑定服务端的Service,绑定成功后用服务端返回的IBinder对象创建一个Messenger,通过这个Messenger就可以向服务端发送消息了,消息类型为Message对象。
如果需要服务端能够回应客户端,就和服务端一样,还需要创建一个Handler对象并创建一个新的Messenger,并把这个Messenger对象通过Message的replyTo参数传递给服务端,服务端通过这个replyTo参数就可以回应客户端。
下面为不需要服务端返回数据的demo
Service代码如下
客户端代码
此外,还有一种case,就是服务端与客户端产生交互,服务端在收到客户端消息的时候,也给客户端发送一条消息,完整代码如下
客户端
创建一个Handler对象,并用他来创建一个客户端的Messenger对象,将这个clientMessenger对象以Message的replyTo形式发送个服务端。
代码如下:
服务端
接收Message的replyTo对象,也就是客户端的Messenger对象,然后创建Bundle,填充数据,最后通过clientMessenger对象将消息发送出去
代码如下
查看Log日志,可以发现可以实现正常通信,如下:
上面简单介绍了IPC通讯的三种方式,各有优缺点,Messenger看起来是挺强大的,但是也存在一定的不足,这个在下一篇中进行说明,并且下一篇将着重讲解AIDL的使用及注意事项。
注:
有人觉得demo都是在同一个应用,而没有针对不同应用,说明一下,这样选择在同一个应用内进行进程间通信,因为操作起来比较方便,与两个应用进行进程间通信是一样的,没有本质区别的。
相关文章推荐
- 安卓进入fastboot模式后不能正确安装设备驱动解决办法
- Android 手把手教您自定义ViewGroup(一)
- 《Android Studio实用指南》4.27 使用演示模式
- Android 应用碎片化
- Android.mk详解
- Android 高仿墨迹天气“我”页面
- Android之LinearGradient线性渲染
- 【Android】Android性能优化
- Android RangeSeekBarView 选定范围值的控件
- Android 自定义一个可以展开显示更多的文本布局
- Gradle Android客户端程序打包(基于gradle 2.10版本验证通过)
- Android ActionBar随ScorllView上下拖动而透明度渐变效果
- adb看android程序的cpu和内存消耗
- android开发游记:a-z列表快速查找功能和搜索关键字高亮
- Activity组件的启动过程
- Mac 下用 go 开发Android应用环境设置
- Android Studio GitHub 提交项目代码
- ActionMode,actionModeBackground无效
- Android的logger机制分析
- Android Bitmap的加载和Cache