android studio环境下实现AIDL的碎碎念

来源:互联网 发布:华为平台软件 编辑:程序博客网 时间:2024/04/27 18:40

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中实现相关接口的方法即可,详细方法参照上文中的官方教程,在此不再赘述了。

另附AIDL Callback的样例代码以供参考:AIDL server and client(作者编写)

他人编写示例:AIDLserver  AIDLclient

0 0
原创粉丝点击