FC 13.2 使用Intent传递对象(Serializable和Parcelable)

使用Intent的putExtra方法可以传递数据,但是不能直接来传递自定义的对象。接下来学习两种床底对象的方式

Serializable方式

Serializable是序列化的意思,表示将一个对象转换成可存储或可传输的状态,序列化后可以再网络上传输,或存储到本地。序列化的方法就是让一个类实现Serializable接口(不需要重写方法),然后这个类的所有对象就都是可序列化的了。

用法

  • 新建实体类person,实现Serializable接口。
  • 创建实例,直接传入到putExtra方法里。
  • 使用getParcelableExtra方法获取传递过来的序列化对象。
public class Person implements Serializable{
    private String name;
    private int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
Person person = new Person("小明", 22);
Intent intentPerson = new Intent(MainActivity.this, SecondActivity.class);
intentPerson.putExtra("person", person);
startActivity(intentPerson);
Person person = (Person) getIntent().getSerializableExtra("person");
String personName = person.getName();
text1.setText(personName);

Parcelable方式

Parcelable也可以实现与Serializable相同的效果,不多不同于将对象进行序列化,Parcelable方式的实现原理是将一个完整的对象进行分解,分解后的每一部分都是Intent所支持的数据类型,继而实现传递对象的功能。

用法

  • 创建people实体类,实现Parcelable接口
    • 重写writeToParcel方法describeContents方法:describeContents直接返回0即可,describeContents方法需要调用Parcel的writeXXX方法将实体类people的属性都写出来。
    • 在实体类prople中提供名为CREATOR的常量,这里创建Parcelable.Creator接口的一个实现,将泛型指定为people,重写createFromParcel方法newArray方法,createFromParcel方法里去读取刚才写出的字段,创建people进行返回。这里的读取顺序一定要按刚才写入的顺序完全相同才可以。newArray方法只需要将方法中的size传入数组即可。
  • 创建实例,直接传入到putExtra方法里。
  • 获取对象是略有改动:使用getParcelableExtra方法。
public class People implements Parcelable {
    private String name;
    private int age;

    public People() {
    }
    public People(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public int getAge() {
        return age;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeInt(age);
    }
    @Override
    public int describeContents() {
        return 0;
    }
    public static final Parcelable.Creator<People> CREATOR = new Parcelable.Creator<People>() {
        @Override
        public People createFromParcel(Parcel source) {
            People people = new People();
            people.name = source.readString();
            people.age = source.readInt();
            return people;
        }
        @Override
        public People[] newArray(int size) {
            return new People[size];
        }
    };
}
People people = new People("小明", 22);
Intent intentPeople = new Intent(MainActivity.this, SecondActivity.class);
intentPeople.putExtra("people", people);
startActivity(intentPeople);
People people = (People) getIntent().getParcelableExtra("people");
String peopleName = people.getName();
text2.setText(peopleName);

两种方式的详细讲解

Parcelable的性能要强于Serializable.因此在绝大多数的情况下,Android还是推荐使用Parcelable来完成对类的序列化操作的。(但Parcelable也有不足的方面,因为Parcelable无法将数据进行持久化)。

这篇文章讲的很好:文章

猜你喜欢

转载自blog.csdn.net/easy_purple/article/details/84501065