关于AIDL基础的填坑
经过两天的摸索,笔者顿觉AIDL是个大坑,细节问题稍不注意就会搞事情,唉。
为了不让更多的小伙伴们被坑住浪费时间,我在这里把我这几天遇到的坑总结一下,希望能帮到大家。
1. 坑一, 二者存放aidl文件的包结构必须相同,下面放两个截图:
这是服务端:
这是客户端:
可以看出,二者的IDictionaryManager.aidl的包结构是完全一样的,都是src/com.example.test1,只有这样,当make project或者clean project的时候系统帮我们生成的binder在两个项目中才会是一样的。不一样的话会导致通信失败而报错。实际上笔者感觉可以直接把服务端生成的binder接口直接复制粘贴到客户端,省的出错。
2.坑二,编译坑
要注意最好在app目录下的build.gradle中的android中加入以下话语,下面截图:
不然可能会提示找不到类或者其他乱七八糟的错误。
3.坑三,远程连接服务坑
先来看一下笔者的AndroidManifest.xml文件中关于service的内容:
切记,intent-filter中的action过滤条件可以任意取(但是要注意不要跟其他服务的过滤条件重复而且必须是三级或者三级以上包名)。但是category过滤条件(这里用的是默认的),只能是项目包名(这里就是com.example.test1)。
下面我们来看一下我的客户端申请连接时的intent的配置:
这里注意action必须和服务端服务的action相同, setPackage里的字符串就是要远程连接的服务器程序的程序包名(不一定是服务器端服务所在的包名,而是程序包名)。否则会连接失败。
随本文章上传源码,感兴趣的朋友可以参考下。