Android Studio中使用AIDL以及couldn't find import for class错误、Make后AIDL生成的java文件为空文件等问题解决方法!

以下例程是在Android Studio 3.5.3版本下完成的,AS版本不同AIDL生成的java文件路径也有所不同。

在Android Studio下如何创建aidl文件和生成可被其他类使用的java文件:

1、在工程module目录的src—main中新建一个aidl文件夹,如下图:
Android Studio中使用AIDL以及couldn't find import for class错误、Make后AIDL生成的java文件为空文件等问题解决方法!
2、创建后Android studio会自动在mian下新建aidl文件夹,并且在aidl文件下自动新增一个与项目同名的包(如果在com.imooc.step.service包上右键新建aidl文件,生成的包就是与com.imooc.step.service相同),新建的aidl文件就在这个包下。

如果是别处复制来的aidl文件,就要自己创建相应的文件夹和相应的包,包名需和AndroidManifest.xml中的Package名字一致。总之新建AIDL文件完成后的效果要和下图一样。
Android Studio中使用AIDL以及couldn't find import for class错误、Make后AIDL生成的java文件为空文件等问题解决方法!
3、然后在aidl文件中定义需要提供的功能,原来的basicTypes()方法可以删掉,定义自己的方法就可以了,如下图:
Android Studio中使用AIDL以及couldn't find import for class错误、Make后AIDL生成的java文件为空文件等问题解决方法!
4、现在AIDL还无法在其他类文件中使用,因为定义好AIDL文件只是方便Android Studio帮我们生成所需的AIDL文件对应名字的IPedometerService.java类,可以说ALDL只是一个写给IDE用的模板,生成IPedometerService.java:
Android Studio中使用AIDL以及couldn't find import for class错误、Make后AIDL生成的java文件为空文件等问题解决方法!
5、make成功后去其他类文件中使用,你会发现根本就使用不了,IDE直接报错,这是一个坑,我当时也被折腾了好长时间。
Android Studio中使用AIDL以及couldn't find import for class错误、Make后AIDL生成的java文件为空文件等问题解决方法!
6、前面说过AIDI文件只是一个模板,类文件中是无法直接使用的,要在类中正常使用的必须是类文件,所以可以据此推测出通过IPedometerService.aidl模板文件生成的IPedometerService.java文件没有生成成功,生成的java文件在下图所示目录中:
Android Studio中使用AIDL以及couldn't find import for class错误、Make后AIDL生成的java文件为空文件等问题解决方法!
7、通过上图可以看出IPedometerService.java文件生成成功了,但是内容是空的,所以就无法正常使用了,经过不断的测试最终才找到问题所在,竟然是因为中文注释的问题导致的,实在是很无语,把中文注释去掉,全部改为英文注释,重新make,IPedometerService.java文件才真正生成成功。
Android Studio中使用AIDL以及couldn't find import for class错误、Make后AIDL生成的java文件为空文件等问题解决方法!
8、生成成功的IPedometerService.java文件如下图,至于这个文件结构另行百度,结构比较复杂,一时半会说不清,重要的一点就是:IPedometerService.java内部类Stub继承了Binder并实现 com.imooc.step.IPedometerService.java,所以IPedometerService.Stub 是一个Binder。此时的IPedometerService.java可以在其他类文件中正常使用了。
Android Studio中使用AIDL以及couldn't find import for class错误、Make后AIDL生成的java文件为空文件等问题解决方法!

上面的AIDL文件中定义的数据库类型都是一些普通数据类类型,如果想要AIDL支持自定义实体类对象传输,就要遵循AIDL定义规则才行:

1、首先来一段没有按规则定义的示例,在IPedometerService.aidl文件中导入一个实体类PedometerChartBean,并定义了相关的方法,但是在make时提示:couldn’t find import for class com.imooc.step.beans.PedometerChartBean,IPedometerService.aidl中导入的类PedometerChartBean找不到。到IPedometerService.aidl文件中看看,确实导入了PedometerChartBean这个类.
Android Studio中使用AIDL以及couldn't find import for class错误、Make后AIDL生成的java文件为空文件等问题解决方法!
2、为何提示找不到这个类呢?
AIDL服务只支持有限的数据类型,因此,如果用AIDL服务传递一些复杂的数据就。需要做更一步处理。

参考《Android AIDL定义规则》:
AIDL 使用简单语法,使您能通过可带参数和返回值的一个或多个方法来声明接口。 参数和返回值可以是任意类型,甚至可以是其他 AIDL 生成的接口。

您必须使用 Java 编程语言构建 .aidl 文件。每个 .aidl 文件都必须定义单个接口,并且只需包含接口声明和方法签名。

AIDL作为进程之间通信的桥梁,使用AIDL需要遵守一些规则,包括数据的特定要求。编写AIDL文件需要遵守如下语法规则:

1、文件后缀名必须为aidl;

2、AIDL默认支持的数据类型如下:
byte, short, int, long, boolean, float,double, char, String, CharSequence, List, Map(List,Map中定义的类型也需要是AIDL支持的);

3、AIDL最好别使用中文备注,会导致make后生成的java文件是空的,也就是无法正常使用,当然这个情况不是一定会发生,如果发生了去掉中文注释后重新make试试。

4、AIDL也支持自定义实体类,但对实体类的操作是有要求的,具体过程如下:
1)创建类PedometerChartBean,需要实现Parcelable接口
Android Studio中使用AIDL以及couldn't find import for class错误、Make后AIDL生成的java文件为空文件等问题解决方法!
2)aidl目录下创建相同包名的PedometerChartBean.aidl文件(必须是在aidl目录下,且包名必须与第1步创建的PedometerChartBean类包名一样),并添加如下代码:
package com.imooc.service;
parcelable PedometerChartBean;
Android Studio中使用AIDL以及couldn't find import for class错误、Make后AIDL生成的java文件为空文件等问题解决方法!
3)在其他aidl文件中,添加如下导包语句,引入PedometerChartBean类:
import com.imooc.step.beans.PedometerChartBean;
Android Studio中使用AIDL以及couldn't find import for class错误、Make后AIDL生成的java文件为空文件等问题解决方法!
注意上面3步必须严格按照说明执行,否则就会报couldn’t find import for class com.imooc.step.beans.PedometerChartBean 错误。