Android開發中,我們需要在不同組件(Activity、Service、BroadcastReceiver等)之間傳遞數據,有的時候甚至需要把對象直接傳遞過去。這時候就需要對Java對象進行序列化。Java序列化和反序列化雖然非常方便,但是它的效率很低。而Android提供的Parcelable介面就解決了這個問題,它可以較為高效地序列化和反序列化數據,並且適合在內存之間傳遞對象。
一、Parcelable介面的介紹
Parcelable是Android特有的輕量級序列化方法。與Java的Serializable相比,Parcelable更快更輕巧,而且是一種顯式的序列化方法。它通過將數據一次性寫入或讀取內存塊來完成序列化和反序列化,相對而言效率更高。
Android平台中提供的許多類已經實現了Parcelable介面,例如Intent、Bundle和Cursor等。如果我們需要在自己的類中使用Parcelable,則需要實現Parcelable介面,並實現writeToParcel()和createFromParcel()這兩個方法。
二、實現Parcelable介面
實現Parcelable介面需要以下幾個步驟:
1、定義一個實現Parcelable介面的類:
public class User implements Parcelable { private String userName; private int age; //構造方法 public User(String userName, int age) { this.userName = userName; this.age = age; } //Getter和Setter方法 public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } //實現Parcelable介面 @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(this.userName); dest.writeInt(this.age); } protected User(Parcel in) { this.userName = in.readString(); this.age = in.readInt(); } public static final Creator CREATOR = new Creator() { @Override public User createFromParcel(Parcel source) { return new User(source); } @Override public User[] newArray(int size) { return new User[size]; } }; }
2、實現Parcelable介面中的抽象方法describeContents(),返回0即可。
3、實現Parcelable介面中的抽象方法writeToParcel(Parcel dest, int flags),將需要序列化的數據寫入Parcel中。
4、實現Parcelable介面中的構造方法,將需要反序列化的數據讀取出來。注意:讀取數據的順序必須與寫入數據的順序一致。
5、實現Parcelable介面中的CREATOR靜態變數,用於反序列化數據。其中包含兩個抽象方法createFromParcel(Parcel source)和newArray(int size)。
三、使用Parcelable序列化對象
使用Parcelable序列化Java對象需要以下幾個步驟:
1、將需要傳遞的Java對象打包成Parcel對象:
User user = new User("Tom", 25); Parcel parcel = Parcel.obtain(); user.writeToParcel(parcel, 0);
2、通過Bundle將Parcel對象傳遞給需要的組件,例如Activity:
Intent intent = new Intent(MainActivity.this, SecondActivity.class); Bundle bundle = new Bundle(); bundle.putParcelable("user", parcel); intent.putExtras(bundle); startActivity(intent);
3、將Parcel對象傳遞給需要的組件:
Intent intent = getIntent(); Bundle bundle = intent.getExtras(); Parcel parcel = bundle.getParcelable("user"); User user = User.CREATOR.createFromParcel(parcel);
四、總結
Parcelable是Android特有的一種序列化方法,與Java的Serializable相比,Parcelable更快更輕巧,並且適合在內存之間傳遞對象。使用Parcelable序列化Java對象需要實現Parcelable介面,並實現writeToParcel()和createFromParcel()這兩個方法。將需要傳遞的Java對象打包成Parcel對象,通過Bundle將Parcel對象傳遞給需要的組件,將Parcel對象傳遞給需要的組件並進行反序列化即可。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/293479.html