您的位置:首页 > 移动开发 > Android开发

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都是在同一个应用,而没有针对不同应用,说明一下,这样选择在同一个应用内进行进程间通信,因为操作起来比较方便,与两个应用进行进程间通信是一样的,没有本质区别的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: