binder共享内存
硬盘或者网络,,必须Serializable,序列化时会产生大量的临时变量,从而引起频繁的GC
Parcelable只适用于android 跨进程调用,性能优,不能保证持续性,不能磁盘使用
SQLite和SharePreferences也是序列化
面试:
1、Android使用Bundle而不直接用Map?
A:Bundle使用场景是小数据量的操作,使用Bundle操作速度和内存上都比较占优势,因为其内部由ArrayMap实现,ArrayMap内部是两个数组,一个int数组保存下标,一个对象数组保存<key, value>,使用二分法对key进行排序,在增删查都使用的是二分法,使用于小数据操作,
EMPTY = new Bundle(); EMPTY.mMap = ArrayMap.EMPTY; ArrayMap<String, Object> map = mMap;
mHashes = EmptyArray.INT;
mArray = EmptyArray.OBJECT;
HashMap内部是数组和链表,在数据少的时候,Entry Array比ArrayMap占用的内存多,另外,Android中intent携带数据需要的是基本数据类型或者可序列化类型,HashMap用Serializable序列化,Bundle用Parcelable序列化,Bundle加快序列化和反序列化,方便数据传输
public final class Bundle extends BaseBundle implements Cloneable, Parcelable {
2、为何Intent传递数据要通过序列化?
A:因为intent启动其他组件的时候,会离开当前应用程序,进入AMS,这就意味着Intent数据会在不同进程间传输,,,Android基础linux,不同进程间java对象是不能传输的,,所以进行序列化,让其在AMS进程和APP进程之间传输;
Serializable使用方便,Parcelable性能好,
3、Bundle/Intent通信原理及大小限制:
A:Intent中的Bundle是用Binder机制进行数据传输的,能使用的Binder缓冲区是有大小限制的,一个进程默认有16个Binder线程,线程能占的缓冲区比较小,资料显示128K差不多