什么是 Parcelable
- Parcelable 是用于对象序列化的一种接口。通俗来讲,Parcelable 允许将一个对象转化为一个字节流,这样你就可以将这个对象在不同的组件之间(如 Activity、Service 等)进行传递
为什么需要 Parcelable
- 组件之间通信时(比如在两个 Activity 之间传递数据),传递的对象必须被序列化。序列化是将对象转换成可以存储或传输的格式。它有两种序列化方式:Serializable 和 Parcelable。Parcelable 相对于 Serializable 更高效,因此更推荐使用
Parcelable 的工作流程
-
实现 Parcelable 接口:类需要实现 Parcelable 接口并覆盖
writeToParcel()
方法,将对象的每个字段写入 Parcel 对象中 -
定义一个 CREATOR 静态字段:它是一个实现了
Parcelable.Creator
接口的对象,负责从 Parcel 中读取数据并创建对象
代码示例
-
有一个 User 类,我们想要在两个 Activity 之间传递它
public class User implements Parcelable { // User 类实现了 Parcelable 接口,表示这个类的对象可以被序列化并用于传递。 private String name; private int age; // 定义了两个字段:name(String 类型)和 age(int 类型)。 // 构造函数 public User(String name, int age) { this.name = name; this.age = age; } // 这是一个普通的构造函数,用于创建 User 对象时初始化 name 和 age 字段。 // 从 Parcel 中读取数据的构造函数 protected User(Parcel in) { name = in.readString(); // 从 Parcel 中读取 String 类型的数据并赋值给 name 字段。 age = in.readInt(); // 从 Parcel 中读取 int 类型的数据并赋值给 age 字段。 } // 这是一个特殊的构造函数,用于从 Parcel 对象中读取数据并创建 User 对象。 @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(name); // 将 name 字段写入到 Parcel 中。 dest.writeInt(age); // 将 age 字段写入到 Parcel 中。 } // 这是 Parcelable 接口中的方法,用于将 User 对象的字段写入 Parcel。这样它就可以被系统传输。 @Override public int describeContents() { return 0; } // 这是 Parcelable 接口中的方法。通常返回 0 就可以。它用于描述当前对象的内容类型。 public static final Creator<User> CREATOR = new Creator<User>() { // CREATOR 是一个静态常量,是用于创建 User 类的对象并提供新数组的方法。 // 一个静态字段,用于从 Parcel 中创建新的 User 对象以及 User 数组。它是 Parcelable.Creator<User> 的实例,实现了两个方法:createFromParcel() 和 newArray()。 @Override public User createFromParcel(Parcel in) { return new User(in); } // 从 Parcel 中读取数据并返回一个新创建的 User 对象。 @Override public User[] newArray(int size) { return new User[size]; } // 创建一个指定大小的 User 数组。 }; // CREATOR 的定义结束。这个字段用于实现 Parcelable 接口中的 createFromParcel 和 newArray 方法。 }
-
在 Activity 之间传递这个对象
-
传递数据:
Intent intent = new Intent(CurrentActivity.this, NextActivity.class); User user = new User("Alice", 30); intent.putExtra("user_data", user); startActivity(intent);
-
接收数据:
Intent intent = getIntent(); User user = intent.getParcelableExtra("user_data");
-
总结
-
Parcelable 是用于高效对象序列化和传递的一种方式
-
它比 Serializable 更快,更适合
-
需要实现 Parcelable 接口****并编写序列化和反序列化代码**