想要在两个activity之间使用Intent传递对象,此时被传递对象就必须序列化,在android中序列化一个对象有两种方式,一种是实现Serializable接口,这个非常简单,只需要声明一下就OK了,无痕介入。此外android中还有一种特有的序列化方法,那就是实现Parcelable接口,使用这种方式来序列化的效率要高于实现Serializable接口。不过Serializable接口实在是太方便了,因此在某些情况下实现这个接口还是非常不错的选择。
下面记录下使用Parcelable的注意事项:
使用Parcelable步骤:
1.实现Parcelable接口
2.实现接口中的两个方法
public int describeContents();
public void writeToParcel(Parcel dest, int flags)
第一个方法是内容接口描述,默认返回0就可以了
第二个方法是将我们的对象序列化一个Parcel对象,也就是将我们的对象存入Parcel中
3.实例化静态内部对象CREATOR实现接口Parcelable.Creator,实例化CREATOR时要实现其中的两个方法,其中createFromParcel的功能就是从Parcel中读取我们的对象。
也就是说我们先利用writeToParcel方法写入对象,再利用createFromParcel方法读取对象,因此这两个方法中的读写顺序必须一致,否则会出现数据紊乱。
public class LocationBean implements Parcelable {
//经纬度
private double longitude;
private double latitude;
//附近poi名(例:广发银行(海淀支行))
private String placeName = "";
//详细地址(例如:北京市海淀区海淀大街48号靠近广发银行(海淀支行))
private String address = "";
//所在国家(例:中国)
private String country = "";
// 省份
private String province = "";
//所在城市(例:北京市)
private String city = "";
// 城市编码
private String cityCode = "";
//所在区域(例:海淀区)
private String district = "";
// 区域编码
private String districtCode = "";
//街道(例:海淀大街)
private String streetName = "";
//街道门牌号码(例:48号)
private String streetNum = "";
public LocationBean() {
}
/**
* 这里的读的顺序必须与writeToParcel(Parcel dest, int flags)方法中
* 写的顺序一致,否则数据会有差错,比如你的读取顺序如果是:
* placeName = source.readString();
* address=source.readString();
* 即调换了placeName和address的读取顺序,那么你会发现你拿到的placeName是address的数据,
* 而你拿到的address是placeName的数据
*
* @param in
*/
protected LocationBean(Parcel in) {
longitude = in.readDouble();
latitude = in.readDouble();
placeName = in.readString();
address = in.readString();
country = in.readString();
province = in.readString();
city = in.readString();
cityCode = in.readString();
district = in.readString();
districtCode = in.readString();
streetName = in.readString();
streetNum = in.readString();
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeDouble(longitude);
dest.writeDouble(latitude);
dest.writeString(placeName);
dest.writeString(address);
dest.writeString(country);
dest.writeString(province);
dest.writeString(city);
dest.writeString(cityCode);
dest.writeString(district);
dest.writeString(districtCode);
dest.writeString(streetName);
dest.writeString(streetNum);
}
public static final Creator<LocationBean> CREATOR = new Creator<LocationBean>() {
/**
* 从Parcel中读取数据
*/
@Override
public LocationBean createFromParcel(Parcel in) {
return new LocationBean(in);
}
/**
* 供外部类反序列化本类数组使用
*/
@Override
public LocationBean[] newArray(int size) {
return new LocationBean[size];
}
};
}