Android中Intent傳遞對(duì)象的3種方式詳解
前言
相信Intent的用法大家已經(jīng)比較熟悉了,Intent可以用來啟動(dòng)Activity,Service等等,同時(shí)我們也可以通過Intent來進(jìn)行傳遞數(shù)據(jù),當(dāng)我們使用Intent在Activity 間傳遞信息時(shí)發(fā)現(xiàn)putExtra() 方法并不支持自定義對(duì)象的傳輸,下面就來介紹三種解決方式。
一、Serializable 方式
這是最簡(jiǎn)單的一種方法,因?yàn)槲覀円龅木褪亲屛覀冏远x的對(duì)象實(shí)現(xiàn) Serializable 這個(gè)空接口。
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;
}
}
這個(gè)時(shí)候,就已經(jīng)可以使用Intent 的putExtra() 方法傳遞這個(gè)自定義對(duì)象了,在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方法雖然十分簡(jiǎn)單,但是效率卻不容樂觀,因?yàn)樗鼤?huì)把整個(gè)對(duì)象序列化,開銷十分大,為了追求效率,我們不得不使用另一種方法,也就是Parcelable 方法。
二、Parcelable 方式
令自定義類實(shí)現(xiàn)Parcelable接口,這個(gè)時(shí)候必須重寫兩個(gè)方法
1. describeContents() : 用于描述內(nèi)容接口,一般直接 return 0即可
2. writeToParcel() : 用于將想要傳遞的數(shù)據(jù)寫入到Parcel容器中。
除了這兩個(gè)方法以外,我們還需要?jiǎng)?chuàng)建一個(gè) Parcelable.Creator接口的實(shí)現(xiàn),這個(gè)接口中也需要我們實(shí)現(xiàn)兩個(gè)方法
1. createFromParcel() : 用于將寫入Parcel容器中的數(shù)據(jù)讀出來,用讀出來的數(shù)據(jù)實(shí)例化一個(gè)對(duì)象,并且返回。
2. newArray() :創(chuàng)建一個(gè)長(zhǎ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];
}
};
}
這個(gè)時(shí)候的接收方法與Serializable有點(diǎn)不同,如下
Intent intent = getIntent();
Person person = (Person) intent.getParcelableExtra("person");
在writeToParcel()方法中,我們可以將我們想要的數(shù)據(jù)寫入容器,如果是我們不需要的數(shù)據(jù),那么我們可以放棄寫入,這也是Parcelabel 方法比 Serializable方法高效的原因所在。但是,這種方法比Serializable 方法多了太多的實(shí)現(xiàn)代碼了,有沒有什么辦法能改變這一現(xiàn)狀呢?可以使用插件一鍵生成這些代碼,比如說 Android Parcelable code generator 插件,可以直接在Android Studio Plugins去下載該插件,下載完之后 點(diǎn)擊 Alt+Insert就可以看到Parcelable選項(xiàng)了。
三、JSON 方式
這個(gè)時(shí)候自定義對(duì)象類為
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);
在使用時(shí)別忘了導(dǎo)入Gson 包,否則是無法使用的。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望能對(duì)各位Android開發(fā)者們有所幫助,如果有疑問大家可以留言交流。
- android中intent傳遞list或者對(duì)象的方法
- Android系列之Intent傳遞對(duì)象的幾種實(shí)例方法
- Android 通過Intent使用Bundle傳遞對(duì)象詳細(xì)介紹
- Android 使用Intent傳遞數(shù)據(jù)的實(shí)現(xiàn)思路與代碼
- Android開發(fā)之利用Intent實(shí)現(xiàn)數(shù)據(jù)傳遞的方法
- 詳解Android中Intent傳遞對(duì)象給Activity的方法
- Android編程使用Intent傳遞圖片的方法詳解
- Android Intent傳遞數(shù)據(jù)大小限制詳解
相關(guān)文章
Android實(shí)現(xiàn)二級(jí)購物車的全選加反選、總價(jià)功能
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)二級(jí)購物車的全選加反選、總價(jià)功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04
Android?PopUpWindow實(shí)現(xiàn)卡片式彈窗
大家好,本篇文章主要講的是Android?PopUpWindow實(shí)現(xiàn)卡片式彈窗,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下2022-01-01
Android控件之ProgressBar用法實(shí)例分析
這篇文章主要介紹了Android控件之ProgressBar用法,以一個(gè)完整實(shí)例形式較為詳細(xì)的分析了ProgressBar控件操作進(jìn)度顯示的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09
flutter實(shí)現(xiàn)發(fā)送驗(yàn)證碼功能
這篇文章主要為大家詳細(xì)介紹了flutter發(fā)送驗(yàn)證碼功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07
ViewModel中StateFlow和SharedFlow單元測(cè)試使用詳解
這篇文章主要為大家介紹了ViewModel中StateFlow和SharedFlow單元測(cè)試使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
Kotlin?this關(guān)鍵字的使用實(shí)例詳解
這篇文章主要介紹了Kotlin?this關(guān)鍵字的使用實(shí)例,在Kotlin中,this關(guān)鍵字允許我們引用一個(gè)類的實(shí)例,該類的函數(shù)恰好正在運(yùn)行。此外,還有其他方式可以使this表達(dá)式派上用場(chǎng)2023-02-02

