IPC
-
(跨)进程通讯
-
1、共享物理内存
-
2、通过内核中转
-
-
Binder抽象类\IBinder:接口
-
跨进程通讯内存映射
-
实现方式
-
1、进程A通过系统调用拷贝内容到内核空间。
-
2、由于内核空间与进程B做了内存映射,因此进程B能够知道内核空间的信息。
-
-
-
重写两个方法
-
transact(xx)和onTransact(xx)
-
1、进程B实现了的onTransact(xx)方法,并挂出IBiner接口,外界调用这个接口来获取B的服务。
-
2、进程A获取了IBinder接口,并调用transact(xx),传递消息给B。
-
3、通过Binder驱动的中转,找到该IBinder是进程B放出来的,于是调用onTransact(xx)。
-
-
-
使用AIDL(并发请求)
-
系统根据AIDL生成的一个Interface实例
-
注意点
-
文件类型:用AIDL书写的文件的后缀是 .aidl
-
数据类型:八种基本数据类型,String ,CharSequence,List,Map类型
- 其他需要导包
-
定向tag:AIDL中的定向 tag 表示了在跨进程通信中数据的流向
-
in 表示数据只能由客户端流向服务端(String ,CharSequence)
- 客户端的那个对象不会因为服务端对传参的修改而发生变动
-
out 表示数据只能由服务端流向客户端
- 服务端将会接收到那个对象的的空对象,但是在服务端对接收到的空对象有任何修改之后客户端将会同步变动
-
inout 则表示数据可在服务端与客户端之间双向流通(开销大)
- 服务端将会接收到客户端传来对象的完整信息,并且客户端将会同步服务端对该对象的任何变动
-
-
两种AIDL文件
-
定义parcelable对象,以供其他AIDL文件使用AIDL中非默认支持的数据类型的
-
定义方法接口,以供系统使用来完成跨进程通信的
-
所有的非默认支持数据类型必须通过第一类AIDL文件定义才能被使用。
-
-
-
使用步骤
-
1:新建个aidl文件,编译生成对应的Java接口
-
两个静态类
-
Stub抽象类
-
继承了Binder,重写了onTransact(xx)方法
-
实现了IMyServer 接口,并没有实现里面的方法
-
onTransact(xx)与IMyServer 接口是分离的,我们需要手动在onTransact(xx)里调用IMyServer 方法
-
-
-
-
2:编写Server端业务
-
构造内部类IMyServer.Stub,重写方法
-
在onBind中将Stub返回给客户端
-
注册service
-
-
3:编写Client业务
-
绑定Service
-
重写ServiceConnection
-
asInterface(service)获取IBinder
-
调用方法
-
-
-
-
-
-
使用Messenger
-
概述
-
BindService的时候使用
-
如何提供服务
-
Service端
-
实现一个Handler
-
使用Handler创建Messenger
-
Messenger.getBinder()
-
-
Client端
-
bindService
-
在ServiceConnection的onServiceConnected方法中接收IBinder对象
-
使用IBinder对象创建Messenger
-
使用Messenger对象发送Message
-
-
-