在Android中通過Intent使用Bundle傳遞對象

來源:互聯網
上載者:User

標籤:

IntentBundle傳遞對象SerializableParcelableAndroid開發中有時需要在應用中或進程間傳遞對象,下面詳細介紹Intent使用Bundle傳遞對象的方法。
被傳遞的對象需要先實現序列化,而序列化對象有兩種方式:java.io.Serializable和android.os.Parcelable

Java中使用的是Serializable,而Google在Android使用了自訂的Parcelable。
兩種序列化方式的區別:
1.在使用記憶體的時候,Parcelable比Serializable效能高,推薦使用Parcelable類;
2.Serializable在序列化的時候會產生大量的臨時變數,從而引起頻繁的GC;
3.Parcelable不能使用在要將資料存放區在磁碟上的情況,因為Parcelable不能很好的保證資料的持久性在外界有變化的情況下,這種情況建議使用Serializable。

第一步:定義序列化實體類;

Serializable方式:

 

[java] view plaincopy 
  1. /** 
  2.  * PersonSer 
  3.  *  
  4.  * @author http://blog.csdn.net/zuolongsnail 
  5.  */  
  6. public class PersonSer implements Serializable {  
  7.   
  8.     /** 
  9.      * serialVersionUID的作用是在修改實體類後,可以正常的序列化和還原序列化,在此不多說,大家可以Google百度下。 
  10.      */  
  11.     private static final long serialVersionUID = -7620435178023928252L;  
  12.   
  13.     private String name;  
  14.   
  15.     private int age;  
  16.   
  17.     public String getName() {  
  18.         return name;  
  19.     }  
  20.   
  21.     public void setName(String name) {  
  22.         this.name = name;  
  23.     }  
  24.   
  25.     public int getAge() {  
  26.         return age;  
  27.     }  
  28.   
  29.     public void setAge(int age) {  
  30.         this.age = age;  
  31.     }  
  32.   
  33. }  

 

Parcelable方式:

 

[java] view plaincopy 
  1. /** 
  2.  * PersonPar 
  3.  *  
  4.  * @author http://blog.csdn.net/zuolongsnail 
  5.  */  
  6. public class PersonPar implements Parcelable {  
  7.   
  8.     private String name;  
  9.   
  10.     private int age;  
  11.   
  12.     public String getName() {  
  13.         return name;  
  14.     }  
  15.   
  16.     public void setName(String name) {  
  17.         this.name = name;  
  18.     }  
  19.   
  20.     public int getAge() {  
  21.         return age;  
  22.     }  
  23.   
  24.     public void setAge(int age) {  
  25.         this.age = age;  
  26.     }  
  27.   
  28.     /** 
  29.      * 序列化實體類 
  30.      */  
  31.     public static final Parcelable.Creator<PersonPar> CREATOR = new Creator<PersonPar>() {  
  32.         public PersonPar createFromParcel(Parcel source) {  
  33.             PersonPar personPar = new PersonPar();  
  34.             personPar.name = source.readString();  
  35.             personPar.age = source.readInt();  
  36.             return personPar;  
  37.         }  
  38.   
  39.         public PersonPar[] newArray(int size) {  
  40.             return new PersonPar[size];  
  41.         }  
  42.     };  
  43.   
  44.     @Override  
  45.     public int describeContents() {  
  46.         return 0;  
  47.     }  
  48.   
  49.     /** 
  50.      * 將實體類資料寫入Parcel 
  51.      */  
  52.     @Override  
  53.     public void writeToParcel(Parcel parcel, int flags) {  
  54.         parcel.writeString(name);  
  55.         parcel.writeInt(age);  
  56.     }  
  57.   
  58. }  
第二步:傳遞序列化對象;

 

 

[java] view plaincopy 
  1. Intent intent = new Intent(MainActivity.this, DestActivity.class);  
  2. Bundle bundle = new Bundle();  
  3. switch (v.getId()) {  
  4. case R.id.serializable_btn:  
  5.     // Serializable傳遞對象  
  6.     PersonSer personSer = new PersonSer();  
  7.     personSer.setName("zuolong");  
  8.     personSer.setAge(26);  
  9.     bundle.putSerializable(SER_KEY, personSer);  
  10.     intent.putExtra("type", SER_TYPE);  
  11.     intent.putExtras(bundle);  
  12.     startActivity(intent);  
  13.     break;  
  14. case R.id.parcelable_btn:  
  15.     // Parcelable傳遞對象  
  16.     PersonPar personPar = new PersonPar();  
  17.     personPar.setName("snail");  
  18.     personPar.setAge(27);  
  19.     // Bundle有putParcelableArray和putParcelableArrayList方法,也就可以傳遞數組和列表  
  20.     bundle.putParcelable(PAR_KEY, personPar);  
  21.     intent.putExtra("type", PAR_TYPE);  
  22.     // Intent也有putParcelableArrayListExtra方法,可以傳遞實現Parcelable介面的對象列表  
  23.     intent.putExtras(bundle);  
  24.     startActivity(intent);  
  25.     break;  
  26. }  
第三步:擷取對象;

 

 

[java] view plaincopy 
  1. StringBuffer sb = new StringBuffer();  
  2. String type = getIntent().getStringExtra("type");  
  3. // 根據type判斷是哪種類型  
  4. if (type.equals(MainActivity.SER_TYPE)) {  
  5.     // 擷取Serializable對象  
  6.     PersonSer personSer = (PersonSer) getIntent().getSerializableExtra(  
  7.             MainActivity.SER_KEY);  
  8.     sb.append("----From Serializable----").append("\n");  
  9.     sb.append("Name:").append(personSer.getName()).append("\n");  
  10.     sb.append("Age:").append(personSer.getAge()).append("\n");  
  11. } else if (type.equals(MainActivity.PAR_TYPE)) {  
  12.     // 擷取Parcelable對象  
  13.     PersonPar personPar = (PersonPar) getIntent().getParcelableExtra(  
  14.             MainActivity.PAR_KEY);  
  15.     sb.append("----From Parcelable----").append("\n");  
  16.     sb.append("Name:").append(personPar.getName()).append("\n");  
  17.     sb.append("Age:").append(personPar.getAge()).append("\n");  
  18. }  

 

附源碼:

運行結果:


在Android中通過Intent使用Bundle傳遞對象

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.