Activity之间可以通过Intent和Bundle跳转并传递数据,可以传递的数据类型包括基本数据类型,String以及实现了Parcelable接口或Serializable接口的Object(File实现了Serializable接口):
1.Serializable接口是java中定义实现的,无须重写任何方法,但序列化和反序列化的过程中会产生大量中间变量,占用较大的内存
2.Parcelable接口,是Google专门为Android序列化定制的,序列化过程需要重写writeToParcel(Parcel dest, int flag)方法,反序列化时需要实现一个Parcelable.create<T>的变量。
实现Parcelable接口进行序列化和反序列化:
package com.hust.andoirdStudy; import android.graphics.Bitmap; import android.os.Parcel; import android.os.Parcelable; public class Person implements Parcelable { public String name; public String birthPlace; public int age; public Bitmap icon; public Person() { // 空的构造方法 } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { // writeToParcel负责讲this对象写入Parcel文件中 dest.writeString(name); dest.writeString(birthPlace); dest.writeInt(age); icon.writeToParcel(dest, 0); } public static final Parcelable.Creator<Person> CREATE = new Creator<Person>() {// CREATE方法实现讲Parcel中序列化的对象反序列化为Object @Override public Person createFromParcel(Parcel source) { Person person = new Person(); person.name = source.readString(); person.birthPlace = source.readString(); person.age = source.readInt(); person.icon = Bitmap.CREATOR.createFromParcel(source); return person; } @Override public Person[] newArray(int size) { return new Person[size]; } }; }
实现Serializable接口进行序列化和反序列化:
package com.hust.andoirdStudy; import java.io.Serializable; import android.graphics.Bitmap; public class Person implements Serializable { /** * */ private static final long serialVersionUID = 1L; public String name; public String birthPlace; public int age; public Bitmap icon; public Person() { // 空的构造方法 } }
实现了上面任意一种接口之后,便可以在两个Activity之间传递Object了:
/** * 假设已经有一个存储数据的Person对象 */ Person person = new Person();
发送方-Parcelable:
Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtra("personID", 1110); // 传递普通数据 // 传递实现了Parcelable接口的Object, 当然普通数据也可以放在Bundle中传递 Bundle bundle = new Bundle(); bundle.putParcelable("person", person); intent.putExtras(bundle); startActivity(intent);
接收方-Parcelable:
int personID = getIntent().getExtras().getInt("personID"); Person person = getIntent().getParcelableExtra("person");
发送方-Serializable:
Intent intent = new Intent(MainActivity.this, SecondActivity.class); Bundle bundle = new Bundle(); bundle.putSerializable("person", person); startActivity(intent);
接收方-Serializable:
Person p = (Person) getIntent().getSerializableExtra("person");
[注意]
序列化的本质是将Object的属性信息按照一定的顺序(在Parcelable接口中,按照writeToParcel中写入的顺序)写入序列化文件,而在反序列化过程中按照之前的顺序读出,并创建赋值给一个新的Object,所以要求writeToParcel(Parcel, int)函数中Object属性写入的顺序一定要和Parcelable.Creator<T>中的createFromParcel(Parcel)中read的顺序一致,不然反序列化后得到的Object会有数据错乱的现象。
时间: 2024-10-19 18:12:13