IPC机制---04 Android中的IPC通讯方式(A)

本文介绍了Android中的三种进程间通信(IPC)方式:使用Bundle、文件共享和Messenger。详细解释了每种方法的工作原理和应用场景,包括它们的优点和局限性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 使用Bundle
    • Android四大组件中的三大组件(Activity Service Receiver)都支持在intent中传递Bundle数据,Bunder实现了Parcelable接口,所以它方便在不同的进程间传输。
    • 当我们在一个进程中启动了另一个进程的Activity Service Receiver,我们就可以在Bundle中附近我们需要传输的数据,并通过Intent发送出去,当然,数据必须能够被序列化。
  2. 使用文件共享
    • 文件共享是一种不错的线程间通讯方式,两个进程通过读写同一个文件来实现数据共享。
    • 比如A把数据写入文件,B进程通过读取这个文件获取数据。Android基于Linux,所以就不存在Windows下排斥锁的问题。
    • 除了交换文本信息外,还可以序列化一个对象到文件中,另一个进程通过对改文件进行反序列化来获取数据
    • 对文件格式没有要求,双方约定好即可。存在一定的局限性,比如并发读写等。适合在对数据同步要求不高的线程之间进行通信,并要处理好并发读写的问题
    • SP是一个特例,android提供的轻量级存储方案,通过键值对方式存储数据。属于文件的一种,但是系统对它的读写有一定的缓存策略,也就是说在内存中会有一份SP文件的缓存,因此,在多进程模式下,系统对它的读写就变得不靠谱,很大概率上会丢失数据,不建议进程间通讯使用
  3. 使用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日志,可以发现可以实现正常通信,如下:
  4. 上面简单介绍了IPC通讯的三种方式,各有优缺点,Messenger看起来是挺强大的,但是也存在一定的不足,这个在下一篇中进行说明,并且下一篇将着重讲解AIDL的使用及注意事项。
  • 注:
    • 有人觉得demo都是在同一个应用,而没有针对不同应用,说明一下,这样选择在同一个应用内进行进程间通信,因为操作起来比较方便,与两个应用进行进程间通信是一样的,没有本质区别的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值