越不懂的越爱装
大家都同等:IT世界没有难不难,只有是否了解过
挑战目录
什么是Binder
是一种进程间通信机制。
安卓中每个进程对应一个JVM虚拟机。进程内部存在JVM虚拟机的数据结构(堆、方法区、线程私有区域等)。
进程之间通过内核空间进行交互。
Client和Server
都是JVM虚拟机对应的进程,相当于一个个的安卓应用程序。安卓应用程序间通过IPC进行通信。
AIDL
- AIDL的实现。
-
编写aidl文件
新建一个包名,在新建的包名内创建aidl文件。### TestAIDL.aidl interface TestAIDL { int add(int a,int b); int jian(int a,int b); } -
点击build编译aidl文件,在build的gen、aidl目录下生成对应java文件
image.png
-
接口TestAIDL:对应.aidl文件生成的java文件
-
class Default:add和jian方法的默认实现 (一般直接返回0或null这样的值来实现)
-
静态抽象子类Stub:
-
使用抽象类的方式抽象实现接口TestAIDL的两个方法add和jian
-
实现onTransact方法接收Bindle驱动发出的消息
参数:code、data、replay、flags
code:用于内部switch方法判断执行那个接口方法data:客户端传递过来的参数
replay:服务器返回回去的值
flags:标明是否有返回值,0有(双向)、1没有(单向)
-
onTransact方法中switch语句具体对应接口方法处理
-
-
-
image.png
什么是进程间通信
-
当进程需要向外提供或获取数据时(这里指JVM虚拟机中保存的数据)的一种方式。
-
进程之间是无法进行通信的(存在进程隔离),每个进程都会通过系统调用和内核空间进行交互
-
系统调用:
系统调用主要通过如下两个函数来实现:copy_from_user() //将数据从进程空间拷贝到内核空间 copy_to_user() //将数据从内核空间拷贝到进程空间 -
当进程通过系统调用和内核空间交互时,进程的状态变为内核态:处理器处于特权级最高的(0级)
-
安卓中:为了防止程序恶意读取数据,为每个APP分配UID,
进程间通信有:
- 管道/匿名管道(pipe)
- 管道是半双工的,数据只能向一个方向流动
- 需要双方通信时,需要建立起两个管道
- 只能用于父子进程或者兄弟进程之间
- 队列结构:写的内容被管道另一端的进程读出
- 信号
- 可以在任何时候发给某一进程,而无需知道该进程的状态
- 信号量
- 消息队列
- 共享内存
- 套接字
- 安卓中的Binder
安卓中的进程通信举例
- 四大组件通信(可能是在同一个进程,也可能是在不同进程)
- ActivityManagerService、PackageManagerService 等











网友评论