Parcelable和Parcel
    Parcelable它是一个接口,需要实现describeContent()和writeToParcel(Parcel,int)。
    还有public static final Parcelable.Creator 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 =