在Android中我们可以使用Intent的putExtra()方法来对数据进行传递,然后调用相应的getExtra()方法来获取响应数据,但是putExtra()方法所支持的数据类型是有限的,当我们需要传递自定义对象的时候将无从下手,不过不用着急,因为我们可以使用Serializable和Parcelable接口来实现。
1. Serializable方式的实现
Serializable是序列化的意思,表示将一个对象转换成可存储或可传输的状态。序列化后的对象可以在网络上进行传输,也可以存储到本地。至于序列化的方法也很简单,只需要让一个类去实现Serializable这个接口就可以了。
首先我们新建一个Person类,然后实现Serializable接口:
public class Person implements Serializable {
private int age;
private String name;
public void setAge(int age){
this.age=age;
}
public int getAge(){
return age;
}
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
}
接下来实现在两个Activity中进行对象的传递:
public class FirstActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
Person person=new Person();
person.setAge(20);
person.setName("Tom");
Intent intent=new Intent(FirstActivity.this,SecondActivity.class);
intent.putExtra("person_data",person);
startActivity(intent);
}
}
从SecondActivity中进行数据恢复:
public class SecondActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Person person= (Person) getIntent().getSerializableExtra("person_data");
}
}
这样我们就通过Serializable接口完成了对象的传递。
2. Parcelable方式的实现
首先我们来修改一下Person类中的代码:
public class Person implements Parcelable {
private int age;
private String name;
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(age);//写出age
dest.writeString(name);//写出name
}
public static final Parcelable.Creator<Person> CREATOR=new Parcelable.Creator<Person>(){
@Override
public Person createFromParcel(Parcel source) {
Person person=new Person();
person.age=source.readInt();
person.name=source.readString();
return person;
}
@Override
public Person[] newArray(int size) {
return new Person[size];
}
};
}
我们让Person类实现Parcelable接口,然后重写describeContent()和writeToParcel()两个方法。在describeContents()方法中直接返回0即可,writeToParcel()方法中我们需要调用writeXxx()方法写出Person的两个字段。除此之外,我们还需要在Person中提供一个名为CREATOR的常量,创建一个Parcelable.Creator接口的实现,将泛型指定为Person,接着重写createFromParcel()和newArray()两个方法。在createFromParcel()方法中,我们调用readXxx()方法读取在writeToParcel()中的两个字段,注意读取的顺序要和写入的顺序完全相同。最后在newArray()方法中,new出一个Person的数组,并使用传入的size作为数组大小返回即可。
FirstActivity中的代码不需要进行改动,在SecondActivity中我们将方法稍加改动即可:
public class SecondActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Person person= (Person) getIntent().getParcelableExtra("person_data");
}
}
3. Serializable和Parcelable方式对比
通过上面两个实现方法我们可以发现Serializable方式实现较为简单。但是在性能方面,Parcelable更具有优势,其内存开销更小,更适合在内存中传递数据,例如Activity之间。而Serializable可将数据持久化保存,所以在需要保存或者网络上传递数据应该使用Serializable。两种都是用于支持序列化、反序列化话操作,两者最大的区别在于存储媒介的不同,Serializable使用IO读写存储在硬盘上,而Parcelable是直接在内存中读写,很明显内存的读写速度通常大于IO读写,所以在Android中通常优先选择Parcelable。