Android进程间通信

2020-02-22  本文已影响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网络数据实时交换

上一篇 下一篇

猜你喜欢

热点阅读