Parcelable
是Android提供的序列化接口,對比Serializable
它的使用方式更爲複雜,可是效率更高,常常用於AIDL通訊等。java
//實現 Parcelable接口
public class Person implements android.os.Parcelable {
private int age;
private String name;
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
//按照順序寫入
dest.writeInt(this.age);
dest.writeString(this.name);
}
public Person() {
}
protected Person(Parcel in) {
//按照保存順序進行獲取
this.age = in.readInt();
this.name = in.readString();
}
public static final Creator<Person> CREATOR = new Creator<Person>() {
@Override
public Person createFromParcel(Parcel source) {
//從 Parcel 中建立一個Person
return new Person(source);
}
@Override
public Person[] newArray(int size) {
return new Person[size];
}
};
}
複製代碼
重要的是下面兩個方法:android
writeToParcel()
:將變量寫入 Parcel,進行序列化markdown
createFromParcel()
:從 Parcel 中建立序列化的對象ide
若是以爲操做麻煩,還有一種簡單的作法:ui
Android Parcelable code generator
這個插件。Alt+Insert
,最後點擊 Parcelbale 便可。當你建立一個枚舉,想要使用上述插件時,就會發現沒法序列號。這個是由於 Parcel.writeXXX
沒有寫入枚舉的方法,因此沒法直接實現 Parcelable
。this
這個時候,咱們只須要定義一個轉換規則,將枚舉轉換爲 Parcel
能夠寫入的類型,而且支持從 Parcel
獲取變量找到對應的枚舉便可。spa
public enum Fruit implements Parcelable {
/** * 水果 */
APPLE,
BANANA,
WATERMELON;
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
//存入枚舉常量的序數
dest.writeInt(ordinal());
}
public static final Creator<Fruit> CREATOR = new Creator<Fruit>() {
@Override
public Fruit createFromParcel(Parcel in) {
//經過枚舉常量的序數找到對應的枚舉類型
return Fruit.values()[in.readInt()];
}
@Override
public Fruit[] newArray(int size) {
return new Fruit[size];
}
};
}
複製代碼