Parcelable
是Android提供的序列化接口,对比Serializable
它的使用方式更为复杂,但是效率更高,经常用于AIDL通信等。
一、Parcelable基本实现
//实现 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];
}
};
}
重要的是下面两个方法:
writeToParcel()
:将变量写入 Parcel,进行序列化
createFromParcel()
:从 Parcel 中创建序列化的对象
如果觉得操作麻烦,还有一种简单的做法:
- 在 Android Studio 中添加
Android Parcelable code generator
这个插件。 - 打开这个类,使用
Alt+Insert
,最后点击 Parcelbale 即可。

二、enum实现Parcelable接口
当你创建一个枚举,想要使用上述插件时,就会发现无法序列号。这个是因为 Parcel.writeXXX
没有写入枚举的方法,所以无法直接实现 Parcelable
。
这个时候,我们只需要定义一个转换规则,将枚举转换为 Parcel
可以写入的类型,并且支持从 Parcel
获取变量找到对应的枚举即可。
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];
}
};
}
网友评论