IPC机制系列六(2) couldn't find import for class问题的处理

  • 在Android Studio下创建aidl文件,首先需要在工程module目录下的src下main中新建一个aidl文件夹,操作方式如下:

问题处理1

  • 创建后android studio会自动在main下新建aidl文件夹,并且在aidl文件下自动新增一个与项目同名的包,新建的aidl文件就在这个包下。

       如果是别处复制来的aidl文件,就要自己创建相应的文件夹和相应的包,包名需和AndroidManifest.xml中的Package名字一致。总之最后的效果要和下图一样。

问题处理2

       重新编译若顺利通过了,就会在app/build/generated/source/aidl/debug/下生成了MusicConnect.java,但是在编译的时可能会报如下的错误:

问题处理3

       提示MusicConnect.aidl中导入的类MusicData找不到。到MusicConnect.aidl文件中看看,确实导入了MusicData这个类。

问题处理4

       AIDL服务只支持有限的数据类型,因此,如果用AIDL服务传递一些复杂的数据就需要做更一步处理。AIDL服务支持的数据类型如下:

  • Java的简单类型(int、char、boolean等),不需要导入(import)。
  • String和CharSequence,不需要导入(import)。
  • List和Map,要注意,List和Map对象的元素类型必须是AIDL服务支持的数据类型,不需要导入(import)。
  • AIDL自动生成的接口,需要导入(import)。
  • 实现android.os.Parcelable接口的类,需要导入(import)。

       传递不需要import的数据类型的值的方式相同。传递一个需要import的数据类型的值(例如,实现android.os.Parcelable接口的类)的步骤略显复杂。除了要建立一个实现android.os.Parcelable接口的类外,还需要为这个类单独建立一个aidl文件,并使用parcelable关键字进行定义。

       再看看MusicData这个类,它的确是一个实现了android.os.Parcelable接口的类。

问题处理5

       因此还要单独建立一个MusicData.aidl文件,并使用parcelable关键字进行定义。并且要将MusicData.aidl文件放在与MusicData.java文件相对应的entity包中,看下图。

问题处理6

       这时就可以重新编译项目,编译之后就会在app/build/generated/source/aidl/debug/下生成了MusicConnect.java,这样就可以在其他的类中调用MusicConnect.java中的方法了。

问题处理7

参考资料:
穿越人海0225 Android Studio中使用AIDL以及couldn’t find import for class问题的处理

Fork me on GitHub