aidl 全称的意思是 应用接口定义语言,听起来是完全不认识的语言,但实际上写起来和java语言定义接口interface的语法差不多,作用就是用来定义接口,但是这个接口的特点是专门用来给远程的应用调用的(按照我目前的理解),这里的远程指的是不同的进程,其中一个进程作为服务端来提供这个aidl接口,当然接口里面有接口的方法,来给另一个进程中的客户端来访问,简单来说aidl的作用就是实现了跨进程的方法调用。
其次呢,我们讲到回调的时候也会用到接口来实现,既然可以跨进程的接口调用,那么跨进程的回调也当然是可以的,实现起来的步骤也不困难,但是还是有几个重点要注意。
假如现在就来实现两个进程的通信(通常来说两个进程就是对应着两个应用,但是有的应用因为某些原因会以多进程的模式运行,这两者没有本质区别),那么大体上有三个步骤:
1、在服务端创建aidl接口(.aidl文件),在服务Service中实现这个接口对应的Binder,然后将Binder在onBind方法中返回,这个Binder主要是面向远程的进程的,实际上如果本进程的其他组件也来访问这个服务,则不需要将这个Binder返回,而是另外创建一个Binder返回。这里要注意的是aidl文件内不能有中文注释以及名字不能太长。因为这里的服务Service是在别的应用,好像是不可以显式调用服务的(?,所以我这里是给服务添加了一个意图过滤,指定一下action和category(category必须指定,至少有一个default),然后远程客户端就可以通过intent隐式绑定我们的服务了
2、将生成的整个aidl包复制到客户端应用的main目录下
3、绑定服务,这时候需要实现ServiceConnection接口,在onServiceConnected方法中可以拿到IBinder对象,然后通过IxxxxxManager.Stub.asInterface()传入IBinder就可以拿到aidl接口的实现类,接下来只要根据需求调用这个接口的方法就可以了,另外要注意的是,接口调用的方法是运行在服务端的线程池中并且已经实现了同步,并且可能耗时,所以应该在子线程中调用接口的方法
以上就是aidl的简单用法
至于回调的话,回调也是一个aidl接口,同样创建一个aidl文件,然后在客户端调用上面接口的方法中需要传入这个接口类型的参数,再由客户端进行实现回调就可以了
虽然步骤看起来并不复杂,但是aidl的机制据说是很复杂的,我觉得要想学习它之前先用起来再说吧