使用Intent的putExtra方法可以传递数据,但是不能直接来传递自定义的对象。接下来学习两种床底对象的方式
- Serializable方式
- Parcelable方式
- 两种方式的详细讲解
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无法将数据进行持久化)。
这篇文章讲的很好:文章