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个方法需要实现:
序列化和反序列化的顺序必须保持一致。
7.进程2 显示的绑定进程1中的service bindservice();
在serviceconnection的onconnected中得到 Ibinder实例。就可以共享进程1中的数据了。
8.aidl1 =stub.asInterface(binder)—>拿到一个服务的Proxy 代理。
调用aidl1中的方法,实际上是通过代理 transact走操作系统底层,调用另一个进程中方法的过程。
主要用于实现跨进程之间的通信
基本实现:
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走操作系统底层,调用另一个进程中方法的过程。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories