Parcelable和Parcel
Parcelable它是一个接口,需要实现describeContent()和writeToParcel(Parcel,int)。
还有public static final Parcelable.Creator
= new Parcelable.Creator
public BackStackState createFromParcel(Parcel in) {
return new BackStackState(in);
}
public BackStackState[] newArray(int size) {
return new BackStackState[size];
}
};
CREATOR是提供给实现了该parcelable的类的外部使用,下面是FragmentState和BackStackState在FragmentManagerState中的使用
public FragmentManagerState(Parcel in) {
mActive = in.createTypedArray(FragmentState.CREATOR);
mAdded = in.createIntArray();
mBackStack = in.createTypedArray(BackStackState.CREATOR);
}
Parcel和parcelable密不可分的一个类是Parcel,它是对各类数据的读写操作的类。它使用到了native 类型的方法来存储和读取数据,native标记的方法简单的说就是用java的方式调用由其他语言实现的方法。
Parcel本质上就是将数据存储在一块连续的内存当中。并利用C/C++中的指针来指向当前的偏移量(mNativePtr),数据的存储是以4个字节为基本单位。即小于4个字节的以4个字节存储,大于4个字节的以最接近的更大的那个以4为倍数的字节存储。
Write()和read()方法共享偏移量(position),setPosition设置偏移量(4个字节对应一个1个偏移量),dataPosition获取当前偏移量。通过Write()和read()这两个方法来写值和赋值的先后顺序应该。因为共用了一个偏移量,共用了一片内存。否则将读取出不可预知的错误。
WriteValue(Object)和Object ReadValue()方法,是对所有类型的数据都通用,因为实际上它们还是使用的上述两种方法。只不过,在每次WriteValue方法之前,都是先存储一个VALUETYPE值(数据类型标识符),这样在每次readValue时,都会先读取readInt一个VALUE_TYPE值,根据type值来执行对应的read()值。
Parcel支持存储的数据类型,
private static final *int _VAL_STRING = 0;
Private static final int VAL_INTEGER = 1;
private static final int VAL_MAP = 2;
private static final int VAL_BUNDLE = 3;
private static final int VAL_PARCELABLE = 4;
private static final int VAL_SHORT = 5;
private static final int VAL_LONG = 6;
private static final int VAL_FLOAT = 7;
private static final int VAL_DOUBLE = 8;
private static final int VAL_BOOLEAN = 9;
private static final int VAL_CHARSEQUENCE = 10;
private static final int VAL_LIST = 11;
private static final int VAL_SPARSEARRAY = 12;
private static final int VAL_BYTEARRAY = 13;
private static final int VAL_STRINGARRAY = 14;
private static final int VAL_IBINDER = 15;
private static final int VAL_PARCELABLEARRAY = 16;
private static final int VAL_OBJECTARRAY = 17;
private static final int VAL_INTARRAY = 18;
private static final int VAL_LONGARRAY = 19;
private static final int VAL_BYTE = 20;
private static final int VAL_SERIALIZABLE = 21;
private static final int VAL_SPARSEBOOLEANARRAY = 22;
private static final int VAL_BOOLEANARRAY = 23;
private static final int VAL_CHARSEQUENCEARRAY =