stable AIDL

一 概念

讲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的区别和比较

Parcelable和Serializable都是实现序列化并且都可以用于Intent间传递数据,Serializable是Java的实现方式,可能会频繁的IO操作,所以消耗比较大,但是实现方式简单 Parcelable是Android提供的方式,效率比较高,但是实现起来复杂一些 , 二者的选取规则是:内存序列化上选择Parcelable, 存储到设备或者网络传输上选择Serializable(当然Parcelable也可以但是稍显复杂)

选择序列化方法的原则

1)在使用内存的时候,Parcelable比Serializable性能高,所以推荐使用Parcelable。

2)Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。

3)Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。尽管Serializable效率低点,但此时还是建议使用Serializable 。

二 stable AIDL与AIDL区别

1)自动支持 Parcelable

AIDL 传递数据要自己实现 Parcelable接口

Stable AIDL 只需要声明传递数据的结构,编译系统负责实现 Parcelable
2) API 版本化
Stable AIDL 接口稳定后,可通过 m <module name>-freeze-api 进行 freeze 操作

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下冻结的接口的以前版本。 这是可选的。

}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

步基

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值