Android 通過(guò)Intent使用Bundle傳遞對(duì)象詳細(xì)介紹
Android 通過(guò)Intent使用Bundle傳遞對(duì)象
Android開(kāi)發(fā)中有時(shí)需要在應(yīng)用中或進(jìn)程間傳遞對(duì)象,下面詳細(xì)介紹Intent使用Bundle傳遞對(duì)象的方法。
被傳遞的對(duì)象需要先實(shí)現(xiàn)序列化,而序列化對(duì)象有兩種方式:java.io.Serializable和android.os.Parcelable
Java中使用的是Serializable,而谷歌在Android使用了自定義的Parcelable。
兩種序列化方式的區(qū)別:
1.在使用內(nèi)存的時(shí)候,Parcelable比Serializable性能高,推薦使用Parcelable類(lèi);
2.Serializable在序列化的時(shí)候會(huì)產(chǎn)生大量的臨時(shí)變量,從而引起頻繁的GC;
3.Parcelable不能使用在要將數(shù)據(jù)存儲(chǔ)在磁盤(pán)上的情況,因?yàn)镻arcelable不能很好的保證數(shù)據(jù)的持續(xù)性在外界有變化的情況下,
這種情況建議使用Serializable。
第一步:定義序列化實(shí)體類(lèi);
Serializable方式:
/** * PersonSer * * @author http://blog.csdn.net/zuolongsnail */ public class PersonSer implements Serializable { /** * serialVersionUID的作用是在修改實(shí)體類(lèi)后,可以正常的序列化和反序列化,在此不多說(shuō),大家可以谷歌百度下。 */ private static final long serialVersionUID = -7620435178023928252L; private String name; private int 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; } }
Parcelable方式:
/** * PersonPar * * @author http://blog.csdn.net/zuolongsnail */ public class PersonPar implements Parcelable { private String name; private int 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; } /** * 序列化實(shí)體類(lèi) */ public static final Parcelable.Creator<PersonPar> CREATOR = new Creator<PersonPar>() { public PersonPar createFromParcel(Parcel source) { PersonPar personPar = new PersonPar(); personPar.name = source.readString(); personPar.age = source.readInt(); return personPar; } public PersonPar[] newArray(int size) { return new PersonPar[size]; } }; @Override public int describeContents() { return 0; } /** * 將實(shí)體類(lèi)數(shù)據(jù)寫(xiě)入Parcel */ @Override public void writeToParcel(Parcel parcel, int flags) { parcel.writeString(name); parcel.writeInt(age); } }
第二步:傳遞序列化對(duì)象;
Intent intent = new Intent(MainActivity.this, DestActivity.class); Bundle bundle = new Bundle(); switch (v.getId()) { case R.id.serializable_btn: // Serializable傳遞對(duì)象 PersonSer personSer = new PersonSer(); personSer.setName("zuolong"); personSer.setAge(26); bundle.putSerializable(SER_KEY, personSer); intent.putExtra("type", SER_TYPE); intent.putExtras(bundle); startActivity(intent); break; case R.id.parcelable_btn: // Parcelable傳遞對(duì)象 PersonPar personPar = new PersonPar(); personPar.setName("snail"); personPar.setAge(27); // Bundle有putParcelableArray和putParcelableArrayList方法,也就可以傳遞數(shù)組和列表 bundle.putParcelable(PAR_KEY, personPar); intent.putExtra("type", PAR_TYPE); // Intent也有putParcelableArrayListExtra方法,可以傳遞實(shí)現(xiàn)Parcelable接口的對(duì)象列表 intent.putExtras(bundle); startActivity(intent); break; }
第三步:獲取對(duì)象;
StringBuffer sb = new StringBuffer(); String type = getIntent().getStringExtra("type"); // 根據(jù)type判斷是哪種類(lèi)型 if (type.equals(MainActivity.SER_TYPE)) { // 獲取Serializable對(duì)象 PersonSer personSer = (PersonSer) getIntent().getSerializableExtra( MainActivity.SER_KEY); sb.append("----From Serializable----").append("\n"); sb.append("Name:").append(personSer.getName()).append("\n"); sb.append("Age:").append(personSer.getAge()).append("\n"); } else if (type.equals(MainActivity.PAR_TYPE)) { // 獲取Parcelable對(duì)象 PersonPar personPar = (PersonPar) getIntent().getParcelableExtra( MainActivity.PAR_KEY); sb.append("----From Parcelable----").append("\n"); sb.append("Name:").append(personPar.getName()).append("\n"); sb.append("Age:").append(personPar.getAge()).append("\n"); }
附源碼:下載地址
運(yùn)行結(jié)果截圖:
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
- Android中傳值Intent與Bundle的區(qū)別小結(jié)
- android中Intent傳值與Bundle傳值的區(qū)別詳解
- Android 中為什么要用Fragment.setArguments(Bundle bundle)來(lái)傳遞參數(shù)
- 利用adt-bundle輕松搭建Android開(kāi)發(fā)環(huán)境與Hello world(Linux)
- 利用adt-bundle輕松搭建Android開(kāi)發(fā)環(huán)境與Hello world(Windows)
- Android 幾種屏幕間跳轉(zhuǎn)的跳轉(zhuǎn)Intent Bundle
- Android開(kāi)發(fā) Bundle傳值的理解與使用小結(jié)
相關(guān)文章
Android實(shí)現(xiàn)Unity3D下RTMP推送的示例
像Unity3D下的RTMP或RTSP播放器一樣,好多開(kāi)發(fā)者苦于在Unity環(huán)境下,如何高效率低延遲的把數(shù)據(jù)采集并編碼實(shí)時(shí)推送到流媒體服務(wù)器,實(shí)現(xiàn)Unity場(chǎng)景下的低延遲推拉流方案。本文介紹幾種RTMP推送的方案2021-06-06Android控件ListView用法(讀取聯(lián)系人示例代碼)
本文以一個(gè)讀取聯(lián)系人的代碼為大家講解下Android控件中ListView的使用方法,這個(gè)listView有個(gè)setAdapter 適配器,里面可以直接實(shí)現(xiàn)接口,或者寫(xiě)個(gè)類(lèi)2013-06-06Android Studio 透明狀態(tài)欄的實(shí)現(xiàn)示例
這篇文章主要介紹了Android Studio 透明狀態(tài)欄的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04Android中實(shí)現(xiàn)Runnable接口簡(jiǎn)單例子
這篇文章主要介紹了Android中實(shí)現(xiàn)Runnable接口簡(jiǎn)單例子,著重點(diǎn)在如何實(shí)現(xiàn)run()方法,需要的朋友可以參考下2014-06-06