美文网首页
Android进程间通信

Android进程间通信

作者: 非同昨日 | 来源:发表于2020-02-22 20:51 被阅读0次

    1. IPC 简介

    定义:两个进程之间进行数据交互的过程。首先来了解一下什么是进程。按照操作系统的描述,线程是CPU调度的最小单元,而进程一般指一个执行单元,在移动设备上指一个程序或应用;一个进程可以包含多个线程;Android 基于 Linux,而 Linux 出于安全考虑,不同进程间不能之间操作对方的数据,这叫做“进程隔离”。

    2. 为什么要用到多进程?

    1. 分散内存的占用

    我们知道Android系统对每个应用进程的内存占用是有限制的,而且占用内存越大的进程,通常被系统杀死的可能性越大。让一个组件运行在单独的进程中,可以减少主进程所占用的内存,避免OOM问题,降低被系统杀死的概率

    2. 实现多模块

    当我们的应用开发越来越大,模块越来越多,团队规模也越来越大,协作开发也是个很麻烦的事情。项目解耦,模块化,是这阶段的目标。通过模块解耦,开辟新的进程,独立的JVM,来达到数据解耦目的。模块之间互不干预,团队并行开发,责任分工也明确。

    3. 子进程奔溃,主进程可以继续工作

    如果子进程因为某种原因崩溃了,不会直接导致主程序的崩溃,可以降低我们程序的崩溃率。

    3. 多进程可能出现的问题

    静态成员和单例模式完全失效

    每个进程都分配一个独立的虚拟机,而不同的虚拟机在内存分配上有不同的地址空间,这就导致在不同的虚拟机中访问一个同一个对象会产生多份副本。

    线程同步机制完全失效

    SharedPreferences的可靠性下降

    不支持两个进程同时去执行写操作,SharedPreferences底层是通过读/写xml文件

    Application多次创建

    4. Binder

    1. 定义

    Android进程间通信方式有文件、AIDL(基于Binder)、Binder、Messsenger(基于Binder)、ContentProvider(基于Binder)、Socket。从以上方式可见Binder 是Android进程间通信不可不提的核心。Binder 是Android中的一种跨进程通信方式,也可以理解成一种虚拟的物理设备。从Android Framework角度来说,Binder 是ServiceManager连接各种Manager(ActivityManager、WindManger等)和相应ManagerService的桥梁。从Android 应用层来说,Binder是客户端和服务端进行通信的媒介。

    2. Binder机制组成

    Client;

    Server

    ServiceManager

    三部分组件之间的关系:

    Client、Server、ServiceManager均在用户空间中实现,而Binder驱动程序则是在内核空间中实现的;

    在Binder通信中,Server进程先注册一些Service到ServiceManager中,ServiceManager负责管理这些Service并向Client提供相关的接口;

    Client进程要和某一个具体的Service通信,必须先从ServiceManager中获取该Service的相关信息,Client根据得到的Service信息与Service所在的Server进程建立通信,之后Clent就可以与Service进行交互了;

    Binder驱动程序提供设备文件/dev/binder与用户空间进行交互,Client、Server和ServiceManager通过open和ioctl文件操作函数与Binder驱动程序进行通信;

    Client、Server、ServiceManager三者之间的交互都是基于Binder通信的,所以通过任意两者这件的关系,都可以解释Binder的机制。

    3. AIDL 的使用流程

    服务端

    服务端首先创建一个service用来监听客户端的连接请求,然后创建一个AIDL文件,将暴露给客户端的借口在这个文件中声明,最后在Service中实现这个AIDL中的方法。

    客户端

    首先需要绑定服务端的service,然后将服务端返回的Binder对象转成AIDL接口所属的类型,接口就可以调用AIDL中的方法了。

      3.注意事项

    如果使用到AIDIL接口回调,在服务端保存各个注册者的集合需要使用RemoteCallbackList(多次跨进程传输客户端的同一个对象会在服务端生存不同的对象),有个map数据结构专门用来保存所有AIDL的回调,Map的key是Binder类型,Value是callback类型。

    5. 选用合适的IPC方式

    名称优点缺点使用场景

    Bundle简单易用只能传输Bundle支持的数据类型四大组件间的通信

    文件共享简单易用不适合高并发场景,并且无法做到进程间的即时通信无并发访问场景,交互简单的数据实时性不高的场景

    AIDL功能强大,支持一对多并发通信,支持实时通信使用稍复杂,需要处理好线程同步一对多通信且有RPC需求

    Messenger功能一般,支持一对多串行通信,支持实时通信不能很好处理高并发情形,不支持RPC,数据类只能是bundle支持的数据类型低并发的一对多即时通信,无RPC需求,或者无需要返回结果的RPC需求

    ContentProvider在数据源访问方面功能强大,支持一对多并发数据共享主要提供数据源的CRUD操作一对多的进程间的数据共享

    Socket功能强大,可以通过网络传输字节流,支持一对多并发实时通信实现细节比较繁琐,不支持直接RPC网络数据实时交换

    相关文章

      网友评论

          本文标题:Android进程间通信

          本文链接:https://www.haomeiwen.com/subject/bfixcxtx.html