读书笔记:Android中的进程间通信(三)——Android中的IPC方式(上)

阅读的书籍:《Android开发艺术探索》

关键词:Bundle,文件共享,Messenger

使用Bundle:最简单的进程间通信方式,在Intent中传递

Bundle实现了Parcelable接口,所以我们传输的数据必须要能够支持序列化

除了直接传递数据外,还有一种特殊的使用场景

A进程进行一个计算后启动B进程,并把计算结果传给B进程,但这个计算结果并不支持放入Bundle 

间接且巧妙的解决方式:

通过Intent启动B进程的一个Service组件,让这个Service在后台进行计算,计算完毕后再启动B进程中真正要启动的组件

使用文件共享:两个进程通过读/写同一个文件来交换数据

通过文件交换数据除了可以交换一些文本信息之外,还可以序列化对象到文件的同时在另一个进程中反序列化恢复这个对象。虽然前后内容是一样的,但它们本质上还是两个对象 

通过文件共享的局限性:并发读/写的问题

由于这个局限性,文件共享方式适合在对数据同步要求不高的进程之间进行通信,并要妥善处理并发读/写的问题

SharedPreferences是个特例

系统对SharedPreferences的读/写有一定的缓存策略,即在内存中会有一份SharedPreferences文件的缓存,因此在多进程模式下,系统对它的读/写就变得不可靠,当面对高并发的读/写访问时,SharedPreferences有很大几率会丢失数据

使用Messenger:通过它可以在不同进程中传递Message对象,在Message中放入我们需要传递的数据

Messenger的底层实现是AIDL,它对AIDL做了封装,使得我们可以更简便的进行进程间通信

Messenger一次处理一个请求,因此在服务端我们不用考虑线程同步的问题

Demo→服务端接受来自客户端的消息:

服务端:

注册服务,设置单进程:

客户端:

运行结果:

注意,Message中的一个字段object在同进程时很好用,但在进程间通信的时候,只有系统提供的实现了Parcelable接口的对象才能通过它来传输,非系统的Parcelable对象是无法通过object字段来传输的,Bundle可以弥补这个遗憾

Demo→服务端回应客户端(基于上面的代码做一些修改):

服务端:

客户端:

运行结果:

最后是Messenger的工作原理图:

 Messenger的缺点:

Messenger是以串行的方式处理客户端发来的消息,如果大量的消息同时发送到服务端,服务端仍然只能一个个处理,就不适合用了

©️2020 CSDN 皮肤主题: 技术工厂 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值