zoukankan      html  css  js  c++  java
  • 在Android中通过Intent使用Bundle传递对象

    IntentBundle传递对象SerializableParcelable

    Android开发中有时需要在应用中或进程间传递对象,下面详细介绍Intent使用Bundle传递对象的方法。
    被传递的对象需要先实现序列化,而序列化对象有两种方式:java.io.Serializable和android.os.Parcelable

    Java中使用的是Serializable,而谷歌在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的作用是在修改实体类后,可以正常的序列化和反序列化,在此不多说,大家可以谷歌百度下。 
    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(" ");  
    9.     sb.append("Name:").append(personSer.getName()).append(" ");  
    10.     sb.append("Age:").append(personSer.getAge()).append(" ");  
    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(" ");  
    16.     sb.append("Name:").append(personPar.getName()).append(" ");  
    17.     sb.append("Age:").append(personPar.getAge()).append(" ");  
    18. }  

    附源码:下载地址

    运行结果截图:


  • 相关阅读:
    安装EPP的调试Zend Debugger
    PHP一周学习小结
    工作小记
    JQuery实现日期联动
    编程珠玑位图法排序
    Asp.net MVC 4 异步方法
    Powershell实现创建zip压缩文件
    使用JustDecompile修改程序集
    Asp.net MVC 3 异步操作
    HTAs文件应用
  • 原文地址:https://www.cnblogs.com/bigben0123/p/4243630.html
Copyright © 2011-2022 走看看