Parcelable 是 Android 提供的一种序列化和反序列化对象的机制。通过实现 Parcelable 接口,可以将一个对象转换为可传输的数据块,可以在不同的组件(Activity、Fragment、Service等)之间传输。
实现 Parcelable 接口需要完成以下几个步骤:
- 在对象所在的类中实现 Parcelable 接口,并实现以下方法:
public class MyClass implements Parcelable {
// 构造方法
public MyClass() {
// ...
}
// 内容描述,默认返回 0
@Override
public int describeContents() {
return 0;
}
// 序列化方法,将对象写入 Parcel 对象中
@Override
public void writeToParcel(Parcel dest, int flags) {
// 将每个成员变量写入 Parcel 对象中
dest.writeInt(age);
dest.writeString(name);
dest.writeParcelable(address, flags);
// ...
}
// 反序列化的静态成员变量 CREATOR,用于创建对象
public static final Parcelable.Creator<MyClass> CREATOR = new Parcelable.Creator<MyClass>() {
// 反序列化方法,从 Parcel 对象中读取数据并创建对象
@Override
public MyClass createFromParcel(Parcel source) {
return new MyClass(source);
}
@Override
public MyClass[] newArray(int size) {
return new MyClass[size];
}
};
// 反序列化的构造方法,从 Parcel 对象中读取数据并赋值给成员变量
protected MyClass(Parcel in) {
age = in.readInt();
name = in.readString();
address = in.readParcelable(Address.class.getClassLoader());
// ...
}
}
在 writeToParcel 方法中将对象的成员变量写入 Parcel 对象中。可以使用 Parcel 类提供的一系列写入方法,如 writeInt、writeString 等,也可以使用 writeParcelable 方法将其他实现了 Parcelable 接口的对象写入。
-
在反序列化的静态成员变量 CREATOR 中实现 createFromParcel 方法,从 Parcel 对象中读取数据并创建对象。可以使用 Parcel 类提供的一系列读取方法,如 readInt、readString 等,也可以使用 readParcelable 方法读取其他实现了 Parcelable 接口的对象。
-
在反序列化的构造方法中从 Parcel 对象中读取数据并赋值给对象的成员变量。
现在,对象就实现了 Parcelable 接口,可以在 Intent 之间传输,或者保存到 Bundle 中。可以使用 Intent 的 putExtra 方法或 Bundle 的 putParcelable 方法将对象传递给其他组件,使用 Intent 的 getParcelableExtra 方法或 Bundle 的 getParcelable 方法从其他组件中获取传输的对象。
// 创建对象
MyClass obj = new MyClass();
// 将对象传递给其他组件
Intent intent = new Intent(context, OtherActivity.class);
intent.putExtra("myObj", obj);
startActivity(intent);
// 在其他组件中获取传输的对象
MyClass obj = getIntent().getParcelableExtra("myObj");
需要注意的是,Parcelable 的序列化和反序列化过程是在内存中进行的,相比于 Java 的 Serializable 接口,Parcelable 性能更高,但实现过程相对复杂一些。