原文鏈接
這篇主要介紹如何在Android中實(shí)現(xiàn)Parcelable
Bundle對(duì)象傳遞數(shù)據(jù)
我們都知道寸莫,可以使用Bundle對(duì)象在Andriod各大組建之間傳遞數(shù)據(jù),使用Bundle.putXXX(KEY, VALUE)
可以存放一些基本數(shù)據(jù)類(lèi)型以及封裝類(lèi)型,以下是Bundle對(duì)象可以存儲(chǔ)的數(shù)據(jù)類(lèi)型
- primitives(基本數(shù)據(jù)類(lèi)型)
- String
- Serializable
- Parcelable
存儲(chǔ)的時(shí)候使用鍵值的方式進(jìn)行存儲(chǔ)并傳遞
如果我們需要使用Bundle傳遞對(duì)象错洁,我們可以
implements Serializable
,或者implements Parcelable
實(shí)現(xiàn)Serializable接口
這種方式非常簡(jiǎn)單滨达,我們直接實(shí)現(xiàn)Serializable
接口就行哟绊,這個(gè)接口是一個(gè)空的接口册赛,所以我們不需要做任何操作臀叙,如果有必要我們可以定義一個(gè)serialVersionUID
public interface Serializable {
}
我們常見(jiàn)的File
類(lèi)就實(shí)現(xiàn)了這個(gè)接口
public class File
implements Serializable, Comparable<File>
{
...
}
實(shí)現(xiàn)Parcelable接口
這個(gè)相比與 Serializable稍微復(fù)雜一點(diǎn)笆豁,不過(guò)是 Google
推薦的方式郎汪,我們來(lái)看看官方給的一個(gè)例子
public class MyParcelable implements Parcelable {
private int mData;
public int describeContents() {
return 0;
}
public void writeToParcel(Parcel out, int flags) {
out.writeInt(mData);
}
public static final Parcelable.Creator<MyParcelable> CREATOR
= new Parcelable.Creator<MyParcelable>() {
public MyParcelable createFromParcel(Parcel in) {
return new MyParcelable(in);
}
public MyParcelable[] newArray(int size) {
return new MyParcelable[size];
}
};
private MyParcelable(Parcel in) {
mData = in.readInt();
}
}
這個(gè)例子中的對(duì)象只包含了一個(gè)屬性mData
,我們?cè)诳匆粋€(gè)例子
public class User implements Parcelable {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
protected User(Parcel in) {
name = in.readString();
age = in.readInt();
}
public static final Creator<User> CREATOR = new Creator<User>() {
@Override
public User createFromParcel(Parcel in) {
return new User(in);
}
@Override
public User[] newArray(int size) {
return new User[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeInt(age);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
傳遞Parcelable對(duì)象并解析
傳遞
User user = new User("shellhub", 23);
Intent intent = new Intent(this, SecondActivity.class);
intent.putExtra(KEY, user);
startActivity(intent);
解析
User user = getIntent().getExtras().getParcelable(KEY);
因?yàn)榉椒▽?shí)現(xiàn)了泛型闯狱,所以不需要類(lèi)型轉(zhuǎn)換
public <T extends Parcelable> T getParcelable(@Nullable String key) {
Serializable 和 Parcelable之間的區(qū)別
- Parcelable比 Serializable快
- Parcelable需要花更多的時(shí)間寫(xiě)更多的代碼
- Serializable實(shí)現(xiàn)更加簡(jiǎn)單
- Serializable接口會(huì)創(chuàng)建大量臨時(shí)對(duì)象并導(dǎo)致相當(dāng)多的垃圾回收
- Parcelable數(shù)組可以通過(guò)android中的Intent傳遞
public @NonNull Intent putExtra(String name, Parcelable[] value) {
效率對(duì)比
Q&A
對(duì)象中定義的CREATOR
可以改為其他名字么煞赢?
- 不可以,如果定義為其他名字會(huì)報(bào)以下錯(cuò)誤
Caused by: android.os.BadParcelableException: Parcelable protocol requires a Parcelable.Creator object called CREATOR on class com.github.shellhub.parcelable.User
示例代碼
https://github.com/shellhub/android-samples/tree/master/Parcelable