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会有数据错乱的现象。