android中可以使用AIDL定义接口,实现进程间通信。 这个和COM等组件技术原理是一样的。
需要注意的有:
1. AIDL中定义的接口和方法名是不需要权限修饰符的.
2. AIDL中方法的返回类型如果是java基本基本类型则不需要import其他包和接口。
3. AIDL中一般只能import AIDL接口。不能import java的接口,但是List等java接口可以使用。
3. AIDL中方法的返回类型如果是自定义类,则该自定义的类需要:
a. 创建该类名的.aidl文件。
b. 实现Parcelable接口, 并生成CREATOR实例。
例如 SongService.aidl文件定义:
import com.bean.SongInfo;
interface SongService {
List<SongInfo> getSongs();
}
SongInfo.java文件定义
public class SongInfo {
private int id;
private String path;
/*
省略 getter 和 setter
*/
}
I. 首先我们需要在 SongInfo.java文件所在目录下创建SongInfo.aidl文件。否则SongService.aidl中不能import SongInfo.
SongInfo.aidl 文件内容很简单, 只需要加上:
package com.bean.SongInfo;
parcelable SongInfo;
II. 实现Parcelable接口。
import android.os.Parcel;
import android.os.Parcelable;
public class SongInfo implements Parcelable {
private int id;
private String path;
/*
* Ignore the setter and getter
*/
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel out, int arg1) {
out.writeInt(id);
out.writeString(path);
}
}
III. 其实到这里,准备工作还没有完成。 实现了Parcelable接口只是实现了Stub端生成的SongInfo
对象的打包和序列化,并没有完成对象传到Proxy端后解包和反序列化。android的框架中一般是实现一个静态的变量CREATOR.来实现解包和反序列化。
import android.os.Parcel;
import android.os.Parcelable;
public class SongInfo implements Parcelable {
private int id;
private String path;
/*
* Ignore the setter and getter
*/
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel out, int arg1) {
out.writeInt(id);
out.writeString(path);
}
public static final Parcelable.Creator(SingInfo> CREATOR = new Parcelable.Creator<SongInfo>() {
public SongInfo createFromParcel(Parcel in) {
return new SongInfo(in);
}
public SongInfo[] newArray(int size) {
return new SongInfo[size];
}
};
/*
* Add constructor here
*/
public SongInfo(Parcel in) {
id = in.readInt();
path = in.readString();
}
}
这里需要注意的是变量的读和写顺序是一致的,否则变量传递就会出现混乱。如果某个变量没有实现序列化和反序列化,该变量就不能正确传递。至此, AIDL部分准备好了,如果没有错误ADT会自动解析AIDL文件,生成对应的java文件。
在android中,最常见的场景是在Service中定义一些方法,供其他Activity调用.我们可以在Service中生成一个 SongService.Stub的实例, 并实现SongService.Stub中我们定义的接口, 在Activity中我们就可以调用bindService方法,ServiceConnection回调接口中,onServiceConnected()方法的的IBinder参数就是SongService 实例, 通过SongService.Stub.asInterface(ibinder) 取得SongService实例后, 就可以调用AIDL中定义的方法了。