博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
换个角度理解Android的AIDL原理
阅读量:2356 次
发布时间:2019-05-10

本文共 1455 字,大约阅读时间需要 4 分钟。

本文思路

本篇文章笔者谈论的是android使用AIDL进行进程间通信原理,但本文不打算一上来就介绍如何使用AIDL,本文会先假设Android没有提供AIDL我们应该如何“用自己的方式”实现IPC,介绍完这一点之后,本文再对比AIDL这种方式实现IPC,并尝试理解AIDL背后代码之间的关系。下文图片是本文“用自己的方式”实现IPC的案例交互图,如下:

640?wx_fmt=png

LibraryServer跨进程提供图书查询服务流程图.png

图片解释

蓝色部分的LibraryServer和Client是本文案例中两个不同的APP,其中LibraryServer能够提供左边绿色部分的“BookCheckService”服务(包含getBookInfo、getBookList),为了能够拥有提供远程服务的能力LibraryServer同时还“招聘”了Binder这种具有远程交互能力的对象,于是LibraryServer通过“BookCheckService”+"Binder"这对组合就拥有提供远程服务的能力了。而Client也是“招聘”了Binder,企图通过Binder来使用远程服务。“黄色部分”又是什么意思呢?其实这只是笔者对Binder机制在底层通信进行的极简的描述,实际上Binder机制在底层通信十分复杂,笔者打算放在其它篇章讨论;“黄色”部分简单地解释了远程服务LibraryServer其实是将它自己的Binder的句柄注册在内核,Client实际上拿到的只是LibraryServer的Binder的句柄,通过内核的Binder映射,再与远程服务交互。

Demo 关键代码分析

640?wx_fmt=png

image.png

上文是Client  APP运行后的显示效果,功能很简单,下面对主要代码进行说明:

Client端代码

640?wx_fmt=png

image.png

640?wx_fmt=png

image.png

下面这个函数是请求“查询图书信息”远程服务的实现逻辑

640?wx_fmt=png

image.png

同样请求“获取图书列表”远程服务的实现逻辑如下:

640?wx_fmt=png

image.png

远程端LibraryServer 代码

640?wx_fmt=png

image.png

640?wx_fmt=png

image.png

640?wx_fmt=png

image.png

测试结果

640?wx_fmt=png

image.png

AIDL实现IPC

上文提到的是使用“自己的方式”实现IPC,下文介绍在这个案例中是如何使用AIDL通信的,关于如何在AndroidStudio创建AIDL文件,这里笔者不再细说,不清楚的朋友可以参考这篇文章:http://www.jianshu.com/p/d1fac6ccee98,下图为使用AIDL自动生成的代码,如下:

640?wx_fmt=png

image.png

640?wx_fmt=png

image.png

640?wx_fmt=png

image.png

上图是笔者使用AIDL自动成的BooKCheckService.java文件,可以用下面的UML来描述各个类之间的联系,如下:

640?wx_fmt=png

image.png

我们先来看以下关键代码:

640?wx_fmt=png

image.png

再来看看Proxy类中的细节,如下:

640?wx_fmt=png

image.png

到此可以看到AIDL实现IPC与上文我们以“以自己的方式”实现IPC本质是一样的,只是AIDL语言会为我们自动生成相关的类,简化我们的编码工作。

案例源码

https://github.com/ZhongXiaoHong/AIDLExample

作者:钟离四郎
链接:https://www.jianshu.com/p/5de1718454f8
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

                        喜欢 就关注吧,欢迎投稿!

640?wx_fmt=jpeg

你可能感兴趣的文章
Get IT技能知识库 50个领域一键直达
查看>>
浅析C++中的this指针及汇编实现
查看>>
关于32位程序在64位系统下运行中需要注意的重定向问题(有图有真相)(***)
查看>>
解决win10系统中截图异常放大的问题
查看>>
关于Windows高DPI的一些简单总结
查看>>
tlb文件为何而生?
查看>>
IE9 GPU硬件加速到底是实用创新还是噱头
查看>>
几种TCP连接中出现RST的情况
查看>>
IAAS、SAAS 和 PAAS 的区别、理解
查看>>
RichEdit对ole 对象的相关支持总结
查看>>
(分享)win10下双显示屏独立设置不同缩放率的方法
查看>>
管理学十大经典定理
查看>>
杨澜的一句话,却要让我记一生
查看>>
U盘使用心得
查看>>
作为程序员的心态
查看>>
struts 2 s:if标签的使用
查看>>
input 按钮背景,在IE6 IE7中不显示
查看>>
div使用margin:0px auto 不居中
查看>>
JavaScript 事件模型 事件处理机制
查看>>
Invalid character constant
查看>>