关于在Android Studio环境下使用AIDL的基本步骤和常见注意事项

      一期也写过关于AIDL的文章,但是现在使用起来还是有这样和那样的问题,于是就想今天简单总结一下使用步骤和注意事项


1,使用步骤

(1)服务端:

a,在project视图下的main目录下创建一个aidl文件夹,并创建所需.aidl文件(注:其实在AS环境下,只要右键新建一个aidl文件,工程管理工具会自动帮你在main目录下创建一个aidl文件夹)



b,rebuild一下工程,查看.aidl文件对应的接口是否生成(注:如果有必要,后期也可以自己手动来写)



c,这样aidl准备完毕,下一步,自定义一个服务,重写onBind()方法,返回一个aidl接口实例

扫描二维码关注公众号,回复: 2835275 查看本文章

i:在自定义服务里面自定义一个内部实体类继承上述aidl生成的接口中的一个静态内部类Stub,实现在.aidl文件中定义的方法供客户端使用

关键代码:


ii:在onBind()方法中返回这样一个实现.aidl生成接口内部类的实例即可

关键代码:


这里面需要注意几点原理性的东西:

  (1)这里需要的是一个IBinder接口实例

  (2)我们返回的是一个继承了Stub静态内部类的自定义内部类实例

  (3)由此,我们推出这个静态内部类绝对实现了IBinder接口,下面请看:


上面是项目根据.aidl文件生成的静态内部类Stub,其继承了Binder类,到这里就显而易见了,Binder类实现了Ibinder接口,所以上面的写法也就可以明白了。

其实到这里,服务端就已经完成了所有工作,关于.aidl文件的细节,暂时不做讨论,因为有很多。


(2) 客户端:

a,第一步,在工程的相同路径下创建一个相同包名的内容相同的.aidl文件,rebuild一下工程


b,在合适的位置绑定服务

     i:自定义ServiceConnection;接收绑定成功后服务端提供的IBinder接口实例

关键代码:


      ii:创建绑定服务的意图

关键代码:


这里需要注意:

      第一:这里设置的action需要和服务端的服务在主配置文件中静态注册的服务或者在代码中毒抬注册的服务所设置的action保持一致,我们这里可以看一下服务端该服务的配置:


     第二:这里设置的包名是服务所在应用的包名,不是这个service类所对应的包名,所以也是直接在服务端主配置文件的中查看,


 c,然后绑定服务,就可以直接通过绑定成功后,返回回来的aidl接口实例来调用服务端的功能了。



2,注意事项

(1)每次修改.aidl文件都需要rebuild一下工程,AS和Eclipse环境不一样,这个地方需要手动build

(2)有时候我们常常喜欢直接把服务端的aidl文件夹直接copy到客户端对应的路径下,在实际的操作过程中,客户端的文件结构可能会默认加上项目的包名这样一个路径前缀,所以一定要小心,要保证客户端该文件包名和内容与服务端一样就肯定没有问题了

(3)我们在实际的开发过程中,常常需要不断修改服务端的aidl接口,所以在修改的过程中,如果想保证服务端在aidl接口中定义的方法在客服端都可以使用,里面方法的内容和顺序必须一致;当然你也可以试试客户端.aidl文件只有部分服务端.aidl文件内容时以及里面内容顺序不一致时会有说明现象,不过可以给你看一张图,你就会恍然大悟:


上面这张图是根据.aidl文件生成的接口中内部代理类Proxy中对应于每一个方法的标识,当远程调用方法,不在同一个进程中就会使用Proxy代理类来实现函数调用,而调用哪一个函数就是根据函数标识来决定,如果服务端中.aidl文件中两个方法位置对调放在客户端,你会发现除了这两个方法不能用,其他的方法调用都没有问题

(4)非基本类型(基本类型请自己查阅)数据在.aidl文件中使用时,请标注 in,out或者inout标识,不然build出错,比如:

void saveFaceDataToFile(int faceIndex, inout float[] faceData);

猜你喜欢

转载自blog.csdn.net/hfut_why/article/details/81007291