AIDL
我在阅读源码的过程中,发现有很多需要进程间通信的地方,都采用了AIDL的形式,所以这里专门学习一下这个AIDL的用法
简介
AIDL是Android中IPC的一种方式,同样的还有理由共享文件、Messenger等等。但是相对来说,最主要用到的还是AIDL和Messenger————由于后者只能依次处理消息,因此主要还是AIDL用的多一点。而AIDL的底层还是需要用到Binder,这里先不去讨论,之后深究。
从总体上看,AIDL用法就是,把需要通信的两个组件(不同进程)分别作为客户端和服务端,类似于C/S架构,我们需要自定义一份xxx.aidl文件,作为一份通用的协议,这份协议需要在客户端和服务端各执一份。服务端需要实现AIDL文件定义的方法,客户端与服务端取得联系之后,来调用这些方法。因此AIDL使用起来其实很简单,分为以下几个步骤:
准备工作
为了演示用法,这里建立一个小demo。不对是两个,一个客户端,一个服务端
我这里创建了两个工程,分别作为客户端和服务端。
AIDL文件
先简单说下AIDL文件。这个文件作为一个协议,内容用JAVA语法描述的话,就是一个接口,可以将它类比于一个Java的接口文件。不过这个文件比普通的Java接口文件要求要严格一点,具体可以参考这篇文章,感觉说的挺详细的:
Android:学习AIDL,这一篇文章就够了(上)
要知道xxx.aidl不是可以随便放的。由于这份文件是客户端和服务端联系的纽带,因此对于这二者来说,这样一份AIDL文件,从包名到内部各种细节来说,都必须是一模一样的。实现起来也很简单,我们在某一端创建好,复制到另一端就可以了,当然复制的时候要注意目录结构要一致。
我这里在服务端创建一个AIDL文件,挪到客户端就可以了。
在AndroidStudio中很简单的操作:
这样便创建好了我们的AIDL文件,目录结构如下:
然后打开刚才创建的AIDL文件,内容如下:
我这里只是做一个简单的加法运算并返回结果。现在已经定义好了我们的协议。如果定义了一些非基本类型的类,也需要放在和AIDL文件同目录下。然后如下所示,将整个aidl目录复制————粘贴至作为客户端的那一方的同样的目录下:
好了,现在在两遍都编译一下,这样系统会自动的针对我们定义的AIDL文件生成一个对应的接口类,存放在这里:
Server端
接下来,在Server端,创建一个Service,内容如下:
然后在Manifest文件里注册一下,为隐式启动做准备
之后自然要运行一遍,将Service注册一下,之后才可以用
Client端
最后,在Clinet端简单的隐式启动刚才的Service,然后取得那个IBinder对象,转换为IMyAidlInterface对象,就可以使用了:
运行一遍,看看log:
这是服务端:
这是客户端:
总结
以上,介绍了AIDL的大致使用方式,可以看到,AIDL的核心原理其实就是我们定义的AIDL文件会编译时生成一个Java接口文件,这个文件包含了客户端、服务端的所有操作。