Android学习笔记——AS中使用AIDL


Android学习笔记——AS中使用AIDL

文章插图
 
AIDL
我在阅读源码的过程中 , 发现有很多需要进程间通信的地方 , 都采用了AIDL的形式 , 所以这里专门学习一下这个AIDL的用法
简介
AIDL是Android中IPC的一种方式 , 同样的还有理由共享文件、Messenger等等 。但是相对来说 , 最主要用到的还是AIDL和Messenger————由于后者只能依次处理消息 , 因此主要还是AIDL用的多一点 。而AIDL的底层还是需要用到Binder , 这里先不去讨论 , 之后深究 。
从总体上看 , AIDL用法就是 , 把需要通信的两个组件(不同进程)分别作为客户端和服务端 , 类似于C/S架构 , 我们需要自定义一份xxx.aidl文件 , 作为一份通用的协议 , 这份协议需要在客户端和服务端各执一份 。服务端需要实现AIDL文件定义的方法 , 客户端与服务端取得联系之后 , 来调用这些方法 。因此AIDL使用起来其实很简单 , 分为以下几个步骤:
  • 创建一份AIDL文件 , 在其中定义好协议(接口)
  • 把进程间通信的被动一端作为服务端 , 创建一个Service , 实现协议(接口)定义的方法 , 用来处理客户端请求
  • 另一端 , 客户端 , 与服务端建立链接 , 开始调用方法
准备工作
为了演示用法 , 这里建立一个小demo 。不对是两个 , 一个客户端 , 一个服务端
Android学习笔记——AS中使用AIDL

文章插图
 
我这里创建了两个工程 , 分别作为客户端和服务端 。
AIDL文件
先简单说下AIDL文件 。这个文件作为一个协议 , 内容用JAVA语法描述的话 , 就是一个接口 , 可以将它类比于一个Java的接口文件 。不过这个文件比普通的Java接口文件要求要严格一点 , 具体可以参考这篇文章 , 感觉说的挺详细的:
Android:学习AIDL , 这一篇文章就够了(上)
要知道xxx.aidl不是可以随便放的 。由于这份文件是客户端和服务端联系的纽带 , 因此对于这二者来说 , 这样一份AIDL文件 , 从包名到内部各种细节来说 , 都必须是一模一样的 。实现起来也很简单 , 我们在某一端创建好 , 复制到另一端就可以了 , 当然复制的时候要注意目录结构要一致 。
我这里在服务端创建一个AIDL文件 , 挪到客户端就可以了 。
在AndroidStudio中很简单的操作:
Android学习笔记——AS中使用AIDL

文章插图
 
这样便创建好了我们的AIDL文件 , 目录结构如下:
Android学习笔记——AS中使用AIDL

文章插图
 
然后打开刚才创建的AIDL文件 , 内容如下:
Android学习笔记——AS中使用AIDL

文章插图
 
我这里只是做一个简单的加法运算并返回结果 。现在已经定义好了我们的协议 。如果定义了一些非基本类型的类 , 也需要放在和AIDL文件同目录下 。然后如下所示 , 将整个aidl目录复制————粘贴至作为客户端的那一方的同样的目录下:
Android学习笔记——AS中使用AIDL

文章插图
 
好了 , 现在在两遍都编译一下 , 这样系统会自动的针对我们定义的AIDL文件生成一个对应的接口类 , 存放在这里:
Android学习笔记——AS中使用AIDL

文章插图
 
Server端
接下来 , 在Server端 , 创建一个Service , 内容如下:
Android学习笔记——AS中使用AIDL

文章插图
 
然后在Manifest文件里注册一下 , 为隐式启动做准备
Android学习笔记——AS中使用AIDL

文章插图
 
【Android学习笔记——AS中使用AIDL】之后自然要运行一遍 , 将Service注册一下 , 之后才可以用
Client端
最后 , 在Clinet端简单的隐式启动刚才的Service , 然后取得那个IBinder对象 , 转换为IMyAidlInterface对象 , 就可以使用了:


推荐阅读