前面一节讲了AIDL最进本的知识,这一节中将会结合更复杂的场景,更深入地介绍AIDL。(这一节的内容会持续补充完整)
1、Client端是如何实现调用Server端方法的
2、AIDL支持的数据类型
3、AIDL数据类序列化问题
4、AIDL回调的使用
当Server端某个操作执行完后,需要通知Client端自己完成了任务,这个时候回调就带来了很大的便利,和在同一个App中使用回调效果一样。例如在上一节的例子中,Server完成了setName()这个操作(耗时的异步操作更能体现回调的作用)后,要通知Client端自己完成了任务,可以进行下一步的操作了,就是这样一个场景。现在在前面AIDL例子基础上,对回调的使用步骤进行说明。
(1)在Server端IDemoService.aidl同一目录中添加一个新的.aidl接口文件,我这里命名为IDemoCallback.aidl,内容如下:
![](https://img.haomeiwen.com/i15581733/19c19f77d664d75b.png)
(2)在IDemoService.aidl中添加注册/反注册两个方法
![](https://img.haomeiwen.com/i15581733/391e0ea615b2b157.png)
第13行和第15行为新增的方法。将这两个.aidl文件同步到Client端,使C/S两端的aidl文件完全一样,均为
![](https://img.haomeiwen.com/i15581733/99687880ba4e6d1a.png)
最好将两个app都编译一遍,这样后面有些地方可以用代码补全,而不用手动书写。当然在AidlService.java中实现接口的时候肯定会报错的,把新增的方法补上就可以了。
(3)在AidlService.java中添加如下加粗部分的代码,
![](https://img.haomeiwen.com/i15581733/1c45bdcb33fbc430.png)
RemoteCallbackList是系统提供的一个用于存储回调对象的列表,其对象mCallbacks用于存储注册的IDemoCallback对象。通过第3行的callback()方法中的内容,我们可以推测它是采用一种类似于Broadcast的方式来实现回调的。当setName()方法执行完毕后,callback("'Andy song' is setted");就会把回调信息反馈给Client中注册该回调的地方了。
![](https://img.haomeiwen.com/i15581733/c4a75bd1bc94c577.png)
在解绑定的地方调用unRegisterCallback()反注册回调即可,这样就完成了代码整个代码的编写。这里需要注意注册回调的时机,一定要在setName()执行前注册,否则Client端收不到回调信息。
(5)运行C/S端,然后“绑定”/“解绑”,就会看到如下log信息:
![](https://img.haomeiwen.com/i15581733/6c430ca9fa2cdadb.png)
第5行就是回调信息,表示回调成功。
网友评论