使用Bundle
使用文件共享
使用Messenger
轻量级的IPC方案,底层实现是AIDL,一次只处理一个请求,因此在服务端不用考虑线程同步问题
在服务端创建一个Service来处理客户端的连接请求,同时创建一个Handle并通过它来创建一个Messenger对象,然后在Service的onBind中返回这个Messenger对象底层的Binder即可
在客户端进程中,首先要绑定服务端的Service,绑定成功后用服务端返回的IBinder对象创建一个Messenger对象。如果服务端能够回应客户端,就和服务端一样,还需要创建一个Handler并创建一个新的Messenger,并把这个Messenger对象通过Message的replyTo参数传递给服务端,服务端通过这个replyTo参数就可以回应客户端
使用AIDL
服务端创建一个Service用来监听客户端的连接请求,创建一个aidl文件,将暴露给客户端的接口在这个aidl文件中声明,在service中实现这个接口
绑定服务端的service,将服务端返回的binder对象转成aidl接口所属的类型
aidl文件支持的数据类型
基本数据类型
String和CharSequence
ArrayList,里面的元素必须被aidl支持
hashmap,同上,包括key和value
Parcelable
aidl,所有的aidl接口本身也可以在aidl文件中使用
aidl中除了基本数据类型,其他类型的参数必须标上方向:in,out或者inout,in表示输入型参数,out表示输出型参数,inout表示输入输出型参数,只支持方法,不支持声明静态变量
binder会把客户端传递过来的对象重新转化并生成一个新的对象,虽然我们在注册和解注册过程中使用的是同一个客户端对象,但是通过Binder传递到服务端后,会产生两个全新的对象。用RemoteCallbackList可以解决这问题,使用它,beginBroadcast和finishBroadcast必须要配对使用
aidl中使用权限验证功能
onBind中进行验证
服务端的onTransact方法中进行权限验证,验证失败直接返回false,有permission验证,有Uid和pid验证
ContentProvider
创建一个自定义的ContentProvider很简单,只需要继承ContentProvider类并实现6个抽象方法即可:
onCreate 代表ContentProvider的创建,一般做一些初始化操作,运行在主线程,其他有外界回调并运行在Binder线程池中
getType 用来返回一个Uri请求所对应的MIME类型(媒体型
query
update
insert
delete
android:authorities是provider的唯一标识
Socket
流式套接字 TCP 面向连接 三次握手
用户数据报套接字 UDP 无连接
Binder连接池
每个业务模块创建自己的AIDL接口并实现此接口,然后向服务端提供自己的唯一标识和其对应的Binder对象,对于服务端来说,只需要一个Service就可以了,服务端提供一个equeryBinder接口,这个接口能够根据业务模块的特征来返回相应的Binder对象给他们