android 进程间通信
阅读原文时间:2021年04月20日阅读:1

在一个android APP中,如果有占用内存比较大的操作,我们一般使用进程拆分。比如说对于Webview,图库等,由于存在内存系统泄露或者占用内存过多的问题,我们可以采用单独的进程。不仅如此,我们在一个app中可能会访问其他app的信息。因此,此时就需要用到进程通信。

android 几种进程通信的方式

跨进程通信要求把方法调用及数据分解至操作系统可以识别的程度,并将其从本地进程传输至远程进程。然后在远程进程汇总重新组装并执行该调用。
然后,返回值将沿相反的方向传输回来。

android为我们提供了以下几种进程机制:

  • 文件

  • Socket

  • Messenger(基于Binder)

  • ContentProvider(基于Binder)

  • AIDL

基于Messenger的进程通信

This allows for the implementation of message-based communication across processes

运行实现基于消息的进程间通信方式。

如下图:

可以看到,我们可以在客户端发一个Message给服务器,在服务器端的handler中会接收到客户端的消息,然后进行对应的处理,处理完成后,再将结果等数据封装成message,发送给客户端,客户端的handler中会接收到处理的结果。

此外,记录客户端对象的Messenger,可以实现一对多通信。

Note:每一个Messenger是和Handler一一对应的,因而,所有的任务都将在handler所在的线程中串行执行。但是对于AIDL来说,任务可以在binder 线程上面并行执行。

代码示例:https://download.csdn.net/download/u011337574/10404003

基于AIDL的进程间通信

AIDL的全称为android Interface definition language,顾名思义它是一种android内部进程通信接口的描述语言,是android进程间通信的桥梁。

什么时候使用AIDL

只有当你允许篮子不同的客户端访问你的服务并且需要处理多线程问题时你才必须使用AIDL,其他情况下你可以选择其他方法,如使用Messager。可见AIDL是处理多线程、多客户端并发访问的。而Messager是单线程处理。

示例代码:https://download.csdn.net/download/u011337574/10404023

如何选择这几种通信方式

  • 只有允许不同应用的客户端用IPC方式调用远程方法,并且想要在服务中处理多线程时,才有必要使用AIDL。

  • 如果需要调用远程方法,但不需要处理并发IPC,就应该通过实现一个Binder创建接口。

  • 如果你想执行IPC,但只是传递数据,不涉及方法调用,也不需要高并发,就使用Messenger来实现接口。

  • 如果需要处理一对多的进程间数据共享(主要是数据CRUD),就使用ContentProvider

  • 如果要实现一对多的并发实时通信,就使用Socket。