Android开发 - Parcelable 接口实现不同组件之间传递数据解析

什么是 Parcelable

  • Parcelable 是用于对象序列化的一种接口。通俗来讲,Parcelable 允许将一个对象转化为一个字节流,这样你就可以将这个对象在不同组件之间(如 Activity、Service 等)进行传递

为什么需要 Parcelable

  • 组件之间通信时(比如在两个 Activity 之间传递数据),传递的对象必须被序列化序列化是将对象转换可以存储或传输格式。它有两种序列化方式:SerializableParcelableParcelable 相对于 Serializable高效,因此更推荐使用

Parcelable 的工作流程

  1. 实现 Parcelable 接口需要实现 Parcelable 接口覆盖 writeToParcel() 方法,将对象的每个字段写入 Parcel 对象

  2. 定义一个 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 接口****并编写序列化和反序列化代码**

posted @ 2024-08-29 09:56  阿俊学JAVA  阅读(43)  评论(0编辑  收藏  举报