美文网首页
Android 面试7——Parcelable

Android 面试7——Parcelable

作者: 锦岳 | 来源:发表于2019-05-14 16:47 被阅读0次

Android 中对数据的序列化处理,有两种方式:

  1. 实现 Serializable 接口,这时 Java SE 中提供的序列化支持
  2. 实现 Parcelable 接口,这时 Android 特有的序列化支持
    在 Android 中,除了基本类型的数据之外,其他数据只有实现了 Parcelable 接口才可以被放入 Parcel 中。

1. Parcelable 接口定义

public interface Parcelable {
    //内容描述接口
    public int describeContents();
    //写入接口函数,打包
    public void writeToParcel(Parcel dest, int flags);
     //读取接口,目的是要从 Parcel 中构造一个实现了 Parcelable 的类的实例处理。因为实现类在这里还是不可知的,所以需要用到模板的方式,继承类名通过模板参数传入。
    //为了能够实现模板参数的传入,这里定义Creator嵌入接口,内含两个接口函数分别返回单个和多个继承类实例。
    public interface Creator<T> {
           public T createFromParcel(Parcel source);
           public T[] newArray(int size);
       }

在实现这个接口时,要注意以下几点:

  1. 必须实现 Creator<T> 接口,其中 T 是当前实现类
  2. Creator<T> 接口的实例必须命名为 CREATOR
  3. 从 Parcel 实例中读取数据时,必须按照writeToParcel()方法中填写数据的顺序进行读取

2. 示例

首先实现 Parcelable 接口的实现类

public class Student implements Parcelable {

    private String name;
    private String gender;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public boolean isElder() {
        return isElder;
    }

    public void setElder(boolean elder) {
        isElder = elder;
    }

    private boolean isElder;

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeString(gender);
        dest.writeInt(age);
        dest.writeByte((byte) (isElder ? 1 : 0));
    }

    @Override
    public int describeContents() {
        return 0;
    }

    public static final Creator<Student> CREATOR = new Creator<Student>() {
        @Override
        public Student createFromParcel(Parcel in) {
            Student student = new Student();
            student.setName(in.readString());
            student.setGender(in.readString());
            student.setAge(in.readInt());
            student.setElder(in.readByte() != 0);
            return student;
        }

        @Override
        public Student[] newArray(int size) {
            return new Student[size];
        }
    };
}

在要发送数据的页面,封装具体数据

Student student = new Student();
student.setName("karl");
student.setGender("Male");
student.setAge(31);
student.setElder(false);
intent = new Intent(this, TestActivity.class);
intent.putExtra("student", student);

在要接收数据的页面,实现数据的反序列化

        Intent intent = getIntent();
        Student student = intent.getParcelableExtra("student");
        String text1 = student.getName();
        String text2 = student.getGender();
        int text3 = student.getAge();
        boolean text4 = student.isElder();

相关文章

网友评论

      本文标题:Android 面试7——Parcelable

      本文链接:https://www.haomeiwen.com/subject/dhisaqtx.html