Android AIDL的使用和源码
一、AIDL如何使用?
1、先建立一个工程项目AidlServer, 作为服务端:
2、新建一个aidl文件: 名字自己取,我这里取的是IRemoteService,之后我们就可以看到,文件的生成了,如下:
3、aidl文件建好之后,我们要rebuild一下,这样系统会自动帮我们一些文件,我们跨进程的通信核心代码,基本就在这几个文件里了,下面我们再来仔细分析这个几个文件:
4、rebuild完之后,我们接着新建一个Service,这是用来给客户端调用通信的: 名字自己取,我这里取的是MyService: 接着要在AndroidManifest.xml配置下Service:
5、服务端配置好了,现在轮到配置客户端了,新建一个项目工程AidlClient,需要把服务端的aidl文件下一整个复制过来,注意什么都不要改它的:
复制过来后,rebuild一下。
6、接着就是绑定我们在服务端设置的service: 这样,就完成了客户端与服务端进程间通信了。
二、理解AIDL的原理
从上面我们知道,系统会帮我们自动生成一些aidl相关的代码:
我们来看下这个自动生成的接口IRemoteService文件,它继承了系统的IInterface接口
IRemoteService里面有个Stub类,这个Stub类继承了Binder类,进程间的通信核心就是由Stub来完成的:
而在Stub里,有一个asInterface方法,这个方法用来将服务端的Binder对象(也就是Stub)转换为客户端所需的AIDL接口类型的对象,我们可以来看下AidlClient项目工程里的代码:
接着回来继续看asInterface方法: 再来看Stub类中的onTransact方法:
- code : 确定客户端请求的目标方法是什么。
- data : 如果目标方法有参数的话,就从data取出目标方法所需的参数。
- reply : 当目标方法执行完毕后,如果目标方法有返回值,就向reply中写入返回值。
这个onTransact方法就是服务端处理的核心。接收到客户端的请求,并且通过客户端携带的参数,执行完服务端的方法,返回结果。
从asInterface方法里,我们知道,服务端和客户端如果不在同一个进程的话,会返回系统封装后的Stub.Proxy对象,在new 这个Proxy对象时,传入了obj这个参数,这里的obj就是服务端的Binder对象,也就是说Proxy的构造方法里,mRemote代表的就是服务端的Binder对象:
在Proxy类里,我们看到有个getInfo()方法,这个方法就是我们之前在创建aidl文件时,自己定义的,提供给客户端调用的:
总结下客户端调用getInfo()方法的过程:
Stub充当服务端角色,持有Binder实体(本地对象)。
获取客户端传过来的数据,根据方法 ID 执行相应操作。
将传过来的数据取出来,调用本地写好的对应方法。
将需要回传的数据写入 reply 流,传回客户端。
Proxy代理类充当客户端角色,持有Binder引用(句柄)。
生成 _data 和 _reply 数据流,并向 _data 中存入客户端的数据。
通过 transact() 方法将它们传递给服务端,并请求服务端调用指定方法。
接收 _reply 数据流,并从中取出服务端传回来的数据。
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhfgkkkb
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01