當我們使用Intent
在Activity
間傳遞信息時發(fā)現(xiàn)putExtra()
方法并不支持自定義對象的傳輸,下面就來介紹三種解決方式温圆。
Serializable 方式
這是最簡單的一種方法,因為我們要做的就是讓我們自定義的對象實現(xiàn) Serializable
這個空接口香拉。
public class Person implements Serializable{
private String mName;
private String mAddress;
public String getName() {
return mName;
}
public void setName(String name) {
mName = name;
}
public String getAddress() {
return mAddress;
}
public void setAddress(String address) {
mAddress = address;
}
}
這個時候进栽,就已經(jīng)可以使用Intent
的putExtra()
方法傳遞這個自定義對象了,在Activity
中這樣使用
Person person = new Person();
person.setName("Hwaphon");
person.setAddress("Anhui");
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
intent.putExtra("person",person);
startActivity(intent);
finish();
在Activity
中接收數(shù)據(jù)
Intent intent = getIntent();
Person person = (Person) intent.getSerializableExtra("person");
使用Serializable
方法雖然十分簡單不撑,但是效率卻不容樂觀,因為它會把整個對象序列化晤斩,開銷十分大焕檬,為了追求效率,我們不得不使用另一種方法澳泵,也就是Parcelable
方法实愚。
Parcelable 方式
令自定義類實現(xiàn)Parcelable
接口,這個時候必須重寫兩個方法
1.describeContents()
: 用于描述內容接口兔辅,一般直接 return 0
即可
2.writeToParcel()
: 用于將想要傳遞的數(shù)據(jù)寫入到Parcel
容器中腊敲。
除了這兩個方法以外,我們還需要創(chuàng)建一個 Parcelable.Creator
接口的實現(xiàn)幢妄,這個接口中也需要我們實現(xiàn)兩個方法
1.createFromParcel()
: 用于將寫入Parcel
容器中的數(shù)據(jù)讀出來兔仰,用讀出來的數(shù)據(jù)實例化一個對象茫负,并且返回蕉鸳。
2.newArray()
:創(chuàng)建一個長度為 size
的數(shù)組并且返回,一般而言,直接返回return T[size]
即可潮尝。
public class Person implements Parcelable{
private String mName;
private String mAddress;
public String getName() {
return mName;
}
public void setName(String name) {
mName = name;
}
public String getAddress() {
return mAddress;
}
public void setAddress(String address) {
mAddress = address;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeString(mName);
parcel.writeString(mAddress);
}
public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>(){
@Override
public Person createFromParcel(Parcel parcel) {
Person person = new Person();
person.mName = parcel.readString();
person.mAddess = parcel.readString();
return person;
}
@Override
public Person[] newArray(int i) {
return new Person[i];
}
};
}
這個時候的接收方法與Serializable
有點不同榕吼,如下
Intent intent = getIntent();
Person person = (Person) intent.getParcelableExtra("person");
在writeToParcel()
方法中跃惫,我們可以將我們想要的數(shù)據(jù)寫入容器压彭,如果是我們不需要的數(shù)據(jù)悔醋,那么我們可以放棄寫入届榄,這也是Parcelabel
方法比 Serializable
方法高效的原因所在曲管。但是获列,這種方法比Serializable
方法多了太多的實現(xiàn)代碼了粱胜,有沒有什么辦法能改變這一現(xiàn)狀呢烛占?可以使用插件一鍵生成這些代碼徒蟆,比如說 Android Parcelable code generator
插件胁出,可以直接在Android Studio Plugins
去下載該插件,下載完之后 點擊 Alt+Insert
就可以看到Parcelable
選項了段审。
JSON 方式
這個時候自定義對象類為
public class Person{
private String mName;
private String mAdress;
public String getName() {
return mName;
}
public void setName(String name) {
mName = name;
}
public String getAdress() {
return mAdress;
}
public void setAdress(String adress) {
mAdress = adress;
}
}
使用方式
//Send
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
intent.putExtra("person",new Gson().toJson(person));
// Receive
Intent intent = getIntent();
String JsonData = intent.getStringExtra("person");
Person person = new Gson().fromJson(JsonData,Person.class);
在使用時別忘了導入Gson 包
全蝶,否則是無法使用的。
附注:
我已將Gson
和 Parcelable code generator JAR
包上傳到我的百度云盤寺枉,有需要的可以去下載
Parcelable code generator : http://pan.baidu.com/s/1eRmUgLG