标签:图片 ide 字符 ges imageview 代理 注册 interface 调用
首先,我们来看一下IPC是个啥意思。
IPC是英文Inter-process communication的缩写,顾名思义就是进程间通信或者说跨进程通信。
没错,是进程。所以咱们今天主要说的就是有关进程之间的事儿。
在Android中,因为开发的需要我们可能需要跨应用去操作一些业务,或者项目较大的时候我们需要开启多个进程去完成。但是,Android中为了安全考虑呢,进程之间却又是不能进行数据交互的,为了解决这个问题所以就有了所谓的IPC机制。
其次,我们来说一下今天都会接触到哪些东西呢?
IPC的有哪些方式(一笔带过)
序列化(点到为止,不细说)
Binder机制(今天的主角儿)
AIDL(专为主角设计的模板)
一句话概括,在Android中实现进程间通信的方式有不少,但是最主要的就是Binder机制,同时Android为了快速实现这种功能专门设计了一种模板,叫做AIDL(Android Interface Definition Language 翻译为:Android接口定义语言)。
1、通过Intent的putExtras()方法传递一个Bundle对象(如果只是简单的在进程间来回传递一些基本数据,这是一个很便捷的办法)。
2、通过共享文件来实现数据的共享(如果对该文件没有较高的数据同步要求的话,这也不失为一种很好的办法)。
3、使用四大组件之一的ContentProvider(Android专为进程间数据共享而生的,它的底层原理就是咱们今天的主角儿Binder,但它需要借助其他的数据存储方式来使用)。
4、使用信使Messenger(通过Messenger可以在进程间传递Message对象,因为它是串行的方式处理信息的,没有并发需求的话采用这个很不错,它的底层同样是今天的主角儿Binder)
5、使用Socket(它不但可以跨进程还可以跨设备,但是内存开销比较大,也不太安全)
6、Binder机制(今天的主角儿,性能高、安全)
序列化也叫持久化。进程之间不可以传递对象,Binder也不行。我们要想传递,只能将对象做一下持久化,以便它可以写入到流。详细的咱就不说了,这里主要提一下两种序列化的方式。
1、实现Serializable接口(使用简单,但是开销较大)
2、实现Parcelable接口(使用较为复杂,一般用在内存序列化上,但是效率高)
咱们先来介绍一下进程空间,以及它的特点。
一个进程空间是分为两个部分的,分别是用户空间和内核空间。其中,用户空间之间数据是不可共享的,内核空间是可以数据共享的。
这样说可能比较抽象,我来举个例子。
我们可以把进程想象成一棵棵的大树,其中树地面以上部分我们可以理解成为用户空间,地下的或者说整个大地我们可以理解为内核空间。每棵大树都是独立的存在,但是大地却是大家所共享的。
在一个进程空间中,用户空间和内核空间之间可以通过ioctl等方法来进行数据的交互的。(copy_to_user/copy_from_user)
这样来回拷贝就需要两次。如图
而Binder
则是基于C/S架构( Client - Server),并且通过内存映射来实现IPC通信的,下面咱们具体的介绍一下。
1、Client:客户端(发送请求的进程)
2、Server:服务端(接受请求的进程)
3、Binder驱动:类似网络通信中的路由器,负责将Client的请求转发到具体的Server中执行,并将Server返回的数据传回给Client。
4、ServiceManager:管理所有的需要提供Binder服务的Server的注册与查询,将字符形式的Binder名字转化成Client中对该Binder的引用,使得Client能够通过Binder名字获得对Server中Binder实体的引用。
这里咱们着重说一下ServiceManager:
流程:
1、Server向ServiceManager注册。Server通过Binder驱动向ServiceManager注册,声明可以对外提供服务。ServiceManager中会保留一份映射表。
2、Client向ServiceManager请求Server的Binder引用。Client想要请求Server的数据时,需要先通过Binder驱动向ServiceManager请求Server的Binder引用(代理对象)。再向具体的Server发送请求。Client拿到这个Binder代理对象后,就可以通过Binder驱动和Server进行通信了。
3、Server返回结果。Server响应请求后,需要再次通过Binder驱动将结果返回给Client。
原理:
ServiceManager是一个单独的进程,那么Server与ServiceManager通讯是靠什么呢?当Android系统启动后,会创建一个名称为Servicemanager的进程,这个进程通过一个约定的命令BINDERSETCONTEXT_MGR向Binder驱动注册,申请成为为ServiceManager,Binder驱动会自动为ServiceManager创建一个Binder实体。并且这个Binder实体的引用在所有的Client中都为0,也就说各个Client通过这个0号引用就可以和ServiceManager进行通信。Server通过0号引用向ServiceManager进行注册,Client通过0号引用就可以获取到要通信的Server的Binder引用。
标签:图片 ide 字符 ges imageview 代理 注册 interface 调用
原文地址:https://www.cnblogs.com/HelloHai/p/12417021.html