讲stable AIDL之前,先提及以下概念:
序列化:进行Android开发的时候,无法将对象的引用传给Activities或者Fragments,我们需要将这些对象放到一个Intent或者Bundle里面,然后再传递。也就是将对象转换为可以传输的二进制流(二进制序列)的过程,这样我们就可以通过序列化,转化为可以在网络传输或者保存到本地的流(序列),从而进行传输数据 ,反序列化就是从二进制流(序列)转化为对象的过程。
Bundle:是一种key-value的形态,旨在存取数据。
Intent:用于组建间的数据传递,底层是由Bundle实现,可以在IPC下进行传递,旨在传递数据。Intent.putExtra/getExtra和Bundle的put和get方法一一对应。
Intent和Bundle用法对比
假设需要将数据从页面A传递到B,然后再传递到C。
A页面中:
Intent intent=new Intent(MainActivity.this,BActivity.class);
{//Intent方式
intent.putExtra("String","MainActivity中的值");
intent.putExtra("int",11);
}
{//bundle方式
Bundle bundle = new Bundle();
bundle.putString("String","MainActivity中的值");
bundle.putInt("int",11);
intent.putExtra("bundle",bundle);
}
startActivity(intent);
B页面中:
需要先在B页面中接收数据
Intent intent = getIntent();
{//Intent方式
string = intent.getStringExtra("String");
key = intent.getIntExtra("int",0);
}
{//bundle方式
bundle=intent.getBundleExtra("bundle");
}
然后再发数据到C页面
Intent intent=new Intent(BActivity.this,CActivity.class);
{//Intent方式
intent.putExtra("String1",string);
intent.putExtra("int1",key);
intent.putExtra("boolean",true);
}
{//bundle方式
bundle.putBoolean("boolean",true);
intent.putExtra("bundle1",bundle);
}
startActivity(intent);
可以看到,使用的时候不方便的地方是需要在B页面将数据一条条取出来然后再一条条传输给C页面。
而使用Bundle的话,在B页面可以直接取出传输的Bundle对象然后传输给C页面。
Serializable:Java为我们提供的一个标准化的序列化接口,可能会频繁的IO操作
Parcelable:Android为我们提供的系列化接口,Parcelable相对于Serializable的使用相对复杂一些,但效率号称比serializable快10倍。实现Parcelable的作用有3个:
1)永久性保存对象,保存对象的字节序列到本地文件中;
2)通过序列化对象在网络中传递对象;
3)通过序列化在进程间传递对象。
Parcel:包装了我们需要传输的数据,然后在Binder中传输,用于跨进程传输数据。Parcel提供了一套机制,可以将序列化之后的数据写入到一个共享内存中,其他进程通过Parcel可以从这块共享内存中读出字节流,并反序列化成对象。
Parcel可以包含原始数据类型(用各种对应的方法写入,比如writeInt(),writeFloat()等),可以包含Parcelable对象,它还包含了一个活动的IBinder对象的引用,这个引用导致另一端接收到一个指向这个IBinder的代理IBinder。Parcelable通过Parcel实现了read和write的方法,从而实现序列化和反序列化 。
Parcelable和Serializable都是实现序列化并且都可以用于Intent间传递数据,Serializable是Java的实现方式,可能会频繁的IO操作,所以消耗比较大,但是实现方式简单 Parcelable是Android提供的方式,效率比较高,但是实现起来复杂一些 , 二者的选取规则是:内存序列化上选择Parcelable, 存储到设备或者网络传输上选择Serializable(当然Parcelable也可以但是稍显复杂)
选择序列化方法的原则
1)在使用内存的时候,Parcelable比Serializable性能高,所以推荐使用Parcelable。
2)Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。
3)Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。尽管Serializable效率低点,但此时还是建议使用Serializable 。
1)自动支持 Parcelable
AIDL 传递数据要自己实现 Parcelable接口
Stable AIDL 只需要声明传递数据的结构,编译系统负责实现 Parcelable
2) API 版本化
Stable AIDL 接口稳定后,可通过 m
AIDL 接口被打上版本号并归档。
3)Stable AIDL 默认支持如下接口方法:
- getInterfaceVersion:查询接口的版本号
- setDefaultImpl:当 client 使用的 aidl 版本比 server 新,调用 server 未实现的方法时,会触发默认实现的方法
aidl_interface{
name:模块的名称
local_include_dir:包开始的路径
srcs:将被编译成目标语言的稳定 AIDL 源文件列表
api_dir:转储以前版本接口的API定义的路径;用于确保捕获对接口的APl中断更改
version:这里列出了在api_dir下冻结的接口的以前版本。 这是可选的。
}