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 CreatorCREATOR = 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对象传递给需要的组件并进行反序列化即可。