Android Parcelable


在 Android 中,序列化的实体对象,实现 Parcelable 接口,支持 Intent 数据传递,进程间通信。

将 Bundle 对象数据 向 Parcel parcel 写入时,当 ArrayMap 的 value (Object) 类型是 Parcelable 。

 public final void writeValue(Object v) {
    if (v == null) {
        writeInt(VAL_NULL);
    } else if (v instanceof String) {
        writeInt(VAL_STRING);
        writeString((String) v);
    } else if (v instanceof Integer) {
        writeInt(VAL_INTEGER);
        writeInt((Integer) v);
    } 
    ...
    else if (v instanceof Parcelable) {
        writeInt(VAL_PARCELABLE);
        writeParcelable((Parcelable) v, 0);
    }
    ...
}

对于简单类型,Parcel writeXxxx() 方法。实现 Parcelable 接口的实体类型,Parcel writeParcelable() 方法。

public final void writeParcelable(Parcelable p, int parcelableFlags) {
    if (p == null) {
        writeString(null);
        return;
    }
    writeParcelableCreator(p);
    p.writeToParcel(this, parcelableFlags);
}

实体类 writeToParcel() 方法,实现 Parcelable 接口,重写 writeToParcel() 方法,将每个字段写入 Parcel。

Parcelable 接口示例。

public class Book implements Parcelable {
    private String bookName;
    private int publishDate;    
    public Book() {
    }
    //set/get方法。

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel out, int flags) {
        out.writeString(bookName);
        out.writeInt(publishDate);
    }

    public static final Parcelable.Creator CREATOR = new Creator() {
        @Override
        public Book[] newArray(int size) {
            return new Book[size];
        }

        @Override
        public Book createFromParcel(Parcel in) {
            return new Book(in);
        }
    };

    public Book(Parcel in) {
        bookName = in.readString();
        publishDate = in.readInt();
    }
}

从 Parcel 解析数据。
内部静态对象 CREATOR,实现 Creator 接口,createFromParcel() 方法,创建Parcelable 实体对象,构造参数 Parcel,从 Parcel 提取实体类字段,赋值。


任重而道远

你可能感兴趣的:(Android Parcelable)