Android跨进程通信有哪些
- 访问对应的Activity 的action,这些activity需要指定一个uri;
- Content Provider(跨进程访问其他应用的数据)
- 广播(Broadcast):向应用程序发生广播,而需要夸进程的应用可以接受广播
- AIDL服务 (全称:Android interface definition language 也就是Android接口定义语言)
- messager 只能适合串行通信,并发请求就不行了,还有这个只是信息直接的交互,无法进行跨进程调用。
###这里主要说一下AIDL服务 ###
- 目的:实现进程间通信,尤其是在设计多进程并发情况下的进程间通信。
- 语法特点
- 文件类型:后缀是 .aidl
- 数据类型:AIDL 默认支持默认数据类型(基本类型、String、CharSequence、list类型、Map类型),其他的数据类型需要导入。
- 定向TAG:跨进程通信数据流向,in 为定向 tag 的话表现为服务端将会接收到一个那个对象的完整数据,但是客户端的那个对象不会因为服务端对传参的修改而发生变动;out 的话表现为服务端将会接收到那个对象的的空对象,但是在服务端对接收到的空对象有任何修改之后客户端将会同步变动;inout 为定向 tag 的情况下,服务端将会接收到客户端传来对象的完整信息,并且客户端将会同步服务端对该对象的任何变动。注意:String CharSequence 的定向tag 默认且只能是in
- 两种AIDL:
- 用来定义parcelable对象,以供其他AIDL文件使用AIDL中非默认支持的数据类型的
- 定义方法接口,以供系统使用来完成跨进程通信。
- 通信
- 必须将数据转换为能够在内存直接通信的形式,序列化和反序列化
- 实现AIDL接口,这里主要,如果要调用java文件,需要将java文件的路径和引入的路径相同。
- 通信原理
- 应用层:在服务端实现AIDL接口,在客户端的ServiceConnection的onServiceConnected的方法获取接口实现对象,
- 客户端:看源码实现,可以发现到Proxy类,这个就是客户端和服务器通信的桥梁。分析一下,发现客户端的IBinder 是和服务器数据传输的关键。
- 生成-data和_reply数据流,并向_data中存入客户端的数据。
- 通过transact()方法将他们传递给服务端,并请求服务端低啊用指定方法
- 接收_reply数据流,并从中取出服务端传回了的数据。
- 服务端:查看服务端代码发现服务端哟一个onTransact()方法,它是接受客户端穿过了的数据,通过switch来判断是哪种操作方法。
- 获取客户端返回的数据,根据方法Id执行相依操作。
- 将传递过来的数据取出来,调用本地写好的方法
- 将需要回传的数据写入reply流,传回客户端。
两个图
这是uml结构图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0Z3MQHnQ-1593140214738)(http://ac-cnyv47la.clouddn.com/1a5d6348a02d8171.png)]
这是工作流程图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2Dgl0DCv-1593140214744)(http://ac-cnyv47la.clouddn.com/85e1168eae4ffc13.png)]
相关文档
http://blog.youkuaiyun.com/luoyanglizi/article/details/51980630