四大组件_Service_AIDL_1

AIDL是一个缩写,全称是Android Interface Definition Language,也就是Android接口定义语言。

详细学习见 Android:学习AIDL,这一篇文章就够了(上)

AIDL 补充知识点:四大组件_Service_AIDL_1

AIDL 使用流程:

1、数据类实现 Parcelable 接口。该数据类可以放在任意 java 包下面,但是 Book.java package 要与对应的 Book.aidl package 保持一致。

2、书写 AIDL 文件,一类是数据类对应的 aidl 文件,一类是对应调用接口的 aidl 文件。

3、clean 项目,无报错则表示成功。

4、编写 服务端代码。

5、移植文件到客户端。

6、编写 客户端代码。

关于移植文件到客户端在 AndroidStudio 中的坑:

大家可能注意到了,在 Book.aidl 文件中,我一直在强调:Book.aidl与Book.java的包名应当是一样的。这似乎理所当然的意味着这两个文件应当是在同一个包里面的——事实上,很多比较老的文章里就是这样说的,他们说最好都在 aidl 包里同一个包下,方便移植——然而在 Android Studio 里并不是这样。如果这样做的话,系统根本就找不到 Book.java 文件,从而在其他的AIDL文件里面使用 Book 对象的时候会报 Symbol not found 的错误。为什么会这样呢?因为 Gradle 。大家都知道,Android Studio 是默认使用 Gradle 来构建 Android 项目的,而 Gradle 在构建项目的时候会通过 sourceSets 来配置不同文件的访问路径,从而加快查找速度——问题就出在这里。Gradle 默认是将 java 代码的访问路径设置在 java 包下的,这样一来,如果 java 文件是放在 aidl 包下的话那么理所当然系统是找不到这个 java 文件的。那应该怎么办呢?

又要 java文件和 aidl 文件的包名是一样的,又要能找到这个 java 文件——那么仔细想一下的话,其实解决方法是很显而易见的。首先我们可以把问题转化成:如何在保证两个文件包名一样的情况下,让系统能够找到我们的 java 文件?这样一来思路就很明确了:要么让系统来 aidl 包里面来找 java 文件,要么把 java 文件放到系统能找到的地方去,也即放到 java 包里面去。接下来我详细的讲一下这两种方式具体应该怎么做:

5.1 把  Book.java 和 AIDL 文件在客户端放在一起,让系统来 aidl 包里面来找 java 文件 :即相当于只放到客户端一个包,如图


四大组件_Service_AIDL_1_第1张图片

然后,修改 build.gradle 文件:在 android{} 中间加上下面的内容:


四大组件_Service_AIDL_1_第2张图片

也就是把 java 代码的访问路径设置成了 java 包和 aidl 包,这样一来系统就会到 aidl 包里面去查找 java 文件,也就达到了我们的目的。只是有一点,这样设置后 Android Studio 中的项目目录会有一些改变,我感觉改得挺难看的,如下图。


四大组件_Service_AIDL_1_第3张图片

5.2、把 java 文件放到 java 包下去:

把 Book.java 放到客户端 java 包里任意一个包下,保持其包名不变与 Book.aidl 一致。只要它的包名不变,Book.aidl 就能找到 Book.java

,而只要 Book.java 在 java 包下,那么系统也是能找到它的。但是这样做的话也有一个问题,就是在移植相关 .aidl 文件和 .java 文件的时候没那么方便,不能直接把整个 aidl 文件夹拿过去完事儿了,还要单独将 .java 文件放到 java 文件夹里去。类似于下图


四大组件_Service_AIDL_1_第4张图片

你可能感兴趣的:(四大组件_Service_AIDL_1)