一、Binder是什么?
总的来说,Binder是Android中一种较为底层的通信方式,用来让linux系统有效的管理不同的模块,保证安全方式。
从应用层的层面来说,Binder是Android特有的一种IPC(进程间通信)方式,也是Android中效率较高,最为常用的一种方式。
二、Binder有什么用?
Android是基于Linux系统开发的,而Linux是一种多进程操作系统,多进程可以充分的利用CPU的性能,但同时也对应用的安全性提出了挑战。为了保证各个应用的安全性,Android系统在运行时,会为每一个在运行的进程开辟一个ART虚拟机,每个ART虚拟机有自己独立的内存和资源分配,由此来保证每一个进程能够安全高效的运行。
但是进程太过独立对用户的体验又是不好的,最简单的,当用户想从一个应用复制一段话到另外一段话时,就是把一段话从一个进程复制到另一个进程的过程,如果这个操作都无法执行,那么对用户的体验是极差的。
所以需要进程之间在相对独立来保证安全的同时也是需要有一定交流来保证体验的,于是每一个多进程操作系统都会提供一些IPC机制,也就是进程间通信的机制。在Android中,主要有Bundle、文件共享、Messenger、AIDL、ContentProvider、Socket这些IPC机制,而Messenger、AIDL、ContentProvider这些IPC机制都是基于Binder的。
三、Binder怎么用?
对于Binder的使用,我们一般都是基于Android提供给我们的Messenger、ContentProvider、AIDL这些机制去调用的,现在我们就来说一下Binder在底层的实现。
用户空间和内核空间示意图
由上图可以看到,在Android系统中,和我们上文中说的一样,用户进程之间是相互独立的,用户进程和虚拟内核也是相对独立的,但是用户进程可以有多个,但虚拟内核只会有一个。要让进程间进行通信,那么就需要先把数据从用户空间拷贝到内核空间,然后让另外一个用户进程从内核中把数据拷贝出来。而由于内核空间只支持一些基本数据,所以通过Binder传递的对象必须是经过序列化的,所能传递的对象也必须是要能支持序列化的。
四、使用场景?
总的来说,Binder用于进程间需要通信的时候。
具体的来说,Messenger、AIDL、ContentProvider都基于Binder,而他们的具体使用场景是:
1、Messenger适用于不需要并发的简单数据传输情况,不能相互调用方法;
2、AIDL适用于有并发需求,且涉及进程间相互调用函数的情景;
3、ContentProvider适用于数据比较有格式,且需要提供给较多进程(即一对多的场景)。
五、AIDL的使用步骤
1、首先创建一个service和一个AIDL接口;
2、接着创建一个类继承自AIDL接口中的Stub类并实现Stub中的抽象方法;
3、在Service的onBind方法中返回这个类的对象;
4、然后客户端就可以绑定服务端的Service,建立连接之后就可以访问远程服务端的方法了。
六、Binder连接池
1、Binder连接池是什么?
Binder连接池顾名思义,是一个有一个或多个Binder的“池子”;
2、Binder连接池有什么用?
Binder连接池主要是为了有多个AIDL需要在同一个工程中实现时不必要为每一个Binder都创建一个对应的service;
3、Binder连接池怎么用?
实现步骤:
1、创建相应的AIDL文件;
2、创建相应的连接池AIDL文件,例:IBinderPool;
3、实现对应.aidl对应的Binder类;
4、写BinderPool连接池;