Activity间常用的传值方式一般有两种:
1.创建Intent意图对象中,通过intent的一系列putExtra方法,将一些基本数据类型或者对应的类型数组数据添加到意图中;
2.创建Bundle对象,将基本数据类型或者对应的数组类型存放到Bundle对象中,在传入intent意图中;
而上述两种方式不支持直接携带非基本数据类型的数据,如果需要携带其他对象,则需要通过实现Parcelable接口,intent跟bundle都提供了携带Parcelable对象的方法;且Parcelable不仅支持程序内组件间的数据传输,还支持程序间的数据传输。
Parcelable需要实现writeToParcel、describeContents函数以及静态的CREATOR变量,实际上就是将自己来定义打包和解包的工作,而序列化的这些操作完全由底层实现。
public class ParcelableMap implements Parcelable {
private String name = "zhangsan";
private int age = 0;
public ParcelableMap(){
}
protected ParcelableMap(Parcel in) {
}
public static final Creator CREATOR=new Creator() {
@Override
public ParcelableMap createFromParcel(Parcel in) {
ParcelableMap map =new ParcelableMap();
map.setName(in.readString());
map.setAge(in.readInt());
return map;
}
@Override
public ParcelableMap[] newArray(int size) {
return new ParcelableMap[size];
}
};
@Override
public int describeContents() {
return 0; //默认返回0即可
}
@Override
public void writeToParcel(Parcel dest,intflags) {
dest.writeString(name);
dest.writeInt(age);
}
public String getName() {
return name;
}
public void setRid(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
上面的ParcelableMap类在Activity间的数据传输:
ParcelableMap parcelableMap =new ParcelableMap();
parcelableMap.setName("Lazy");
parcelableMap.setAge(26);
Intent intent = new Intent(this, ImagePlayActivity.class);
intent.putExtra("user",parcelableMap);
this.startActivity(intent);
注:如果没有在writeToParcel函数以及静态的CREATOR变量中的createFromParcel函数做打包跟解包处理的话,传递的对象中的数据可能会不一致。
使用Parcelable的好处:Parcelable的性能比Serializable好,在内存开销方面较小,所以在内存间数据传输时推荐使用Parcelable,如activity间传输数据,而Serializable可将数据持久化方便保存,所以在需要保存或网络传输数据时选择Serializable,因为android不同版本Parcelable可能不同,所以不推荐使用Parcelable进行数据持久化