您的位置:首页 > 移动开发 > Android开发

Android AIDL

2016-07-24 17:15 471 查看
AIDL :Android Interface Defination Language (Android 接口定义语言)

主要用于实现跨进程之间的通信

基本实现:

1.进程1 定义一个aidl1.aidl接口文件。 进程2定义一个相同的aidl1.aidl文件。

2.编译工程,会生成对应的gen\aidl\aidl1.java文件。

3.新建一个RemoteService extands Service ,实现 Onbind 方法。

4.在RemoteService中定义一个Binder对象,

private Binder Mybinder=new aidl1.Stub(){

//实现接口中声明的方法

}

然后在Onbind()方法中将Mybinder返回。

5.aidl 中数据的传递 支持

Byte int long float double char String

其中以下2类需要指定 in或out 表明输入或者输出

比如: List GetList(in List mlist);

List Map

Parceble(自定义类型)需要导包

6.Parceble 接口是一个将对象序列化的接口。

与此类似的还有一个接口Serializable,这是JavaSE本身支持的,而Parcelable是android特有的。

二者比较:

1)、Parcelable使用起来稍复杂点,而后者使用起来非常简单。

2)、Parcelable效率比Serializable高,支持Intent数据传递,也支持进程间通信(IPC)。

3)、Parcelable使用时要用到一个Parcel,可以简单将其看为一个容器,序列化时将数据写入Parcel,反序列化时从中取出。

4)、在使用内存的时候,Parcelable比Serializable性能高,所以推荐使用Parcelable。Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable在外界有变化的情况下不能很好的保证数据的持续性。尽管Serializable效率低点,但此时还是建议使用Serializable 。

如下2个方法需要实现:

序列化和反序列化的顺序必须保持一致。

@Override
public void writeToParcel(Parcel dest, int flags) {
// 序列化过程:必须按成员变量声明的顺序进行封装
dest.writeInt(id);
dest.writeString(name);
}

// 反序列过程:必须实现Parcelable.Creator接口,并且对象名必须为CREATOR
// 读取Parcel里面数据时必须按照成员变量声明的顺序,Parcel数据来源上面writeToParcel方法,读出来的数据供逻辑层使用
public static final Parcelable.Creator<Student> CREATOR = new Creator<Student>() {

@Override
public Student createFromParcel(Parcel source) {
return new Student(source.readInt(), source.readString());
}

@Override
public Student[] newArray(int size) {
return new Student[size];
}
};


7.进程2 显示的绑定进程1中的service bindservice();

在serviceconnection的onconnected中得到 Ibinder实例。就可以共享进程1中的数据了。

8.aidl1 =stub.asInterface(binder)—>拿到一个服务的Proxy 代理。

调用aidl1中的方法,实际上是通过代理 transact走操作系统底层,调用另一个进程中方法的过程。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android aidl 通信 语言