声明:本篇博客是转载自@Rimon吃撑了,其博客地址为:http://blog.csdn.net/sacco90725/article/details/42104085
在此感谢!
AIDL(android Interface Definition Language) 多用于运行于android操作系统上的进程之间实现并发通信,AIDL通过使用 .aidl 文件实现接口的调用。常见接口文件定义如下:
- <span style="font-size:18px;">package com.example.android.aidlserver;
- interface MyParcelable {
- void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
- double aDouble, String aString);
- }</span>
aidl文件的接口定义语法与java接口定义语法基本一致,支持基本数据类型和List Map, 对于自定义对象的引入则需要import,并且自定义对象必须实现Parcelable接口。详细说明参照android AIDL官方教程。(注意:实现了Parcelable的自定义对象也需要创建自己的aidl文件)。常见aidl文件及相关类定义于下:
mAidlInterface.aidl
- package com.example.android.aidlserver;
- import com.example.android.aidlserver.MyParcelable;
- interface mAidlInterface {
- String introduce(in MyParcelable mp);
- }
MyParcelable.java
- package com.example.android.aidlserver;
- import android.os.Parcel;
- import android.os.Parcelable;
- public class MyParcelable implements Parcelable {
- private int mData;
- public int describeContents() {
- return 0;
- }
- public void writeToParcel(Parcel out, int flags) {
- out.writeInt(mData);
- }
- public static final Parcelable.Creator<MyParcelable> CREATOR
- = new Parcelable.Creator<MyParcelable>() {
- public MyParcelable createFromParcel(Parcel in) {
- return new MyParcelable(in);
- }
- public MyParcelable[] newArray(int size) {
- return new MyParcelable[size];
- }
- };
- private MyParcelable(Parcel in) {
- mData = in.readInt();
- }
- }
MyParcelable.aidl
- package com.example.android.aidlserver;
- parcelable MyParcelable;
对于最新版本的android studio 右键new AIDL-AIDL File后,会自动在src/main/目录下创建路径 aidl/<package name>创建的aidl文件即放在这个路径下,根据之前的相关博文以及stackoverflow上的相关问题提示,应将自定义对象的java文件和aidl文件都放于此目录(即上文中的MyParcelable.java 和MyParcelable.aidl) 。
接下来通过build project IDE会自动生成与定义接口相关的文件,文件创建的路径为:app/build/generated/source/aidl/debug/<package name> 下。如下图示:
问题来了,在build的过程中编译器报错。提示如下:
找不到符号(cannot find symbol)即在debug中生成的文件找不到MyParcelable类的定义。
尝试了n种方法后发现,MyParcelable.java 文件不能放在aidl/<package name>路径下!(即不应该与MyParcelable.aidl放在一起)而是应该放在工程的java/<package name>路径下。这样rebuild,就不会再报错了。即文件路径如下图:
之后的工作在service中实现相关接口的方法即可,详细方法参照上文中的官方教程,在此不再赘述了。