android的ipc方式,Android 中的IPC方式

使用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对象给他们

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值