想要在兩個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];
}
};
}