android 通过Intent使用Bundle传递对象

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方式:

/** 
 * PersonSer 
 *  
 * @author http://blog.csdn.net/zuolongsnail 
 */  
public class PersonSer implements Serializable {  
  
    /** 
     * serialVersionUID的作用是在修改实体类后,可以正常的序列化和反序列化,在此不多说,大家可以谷歌百度下。 
     */  
    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;  
    }  
  
    /** 
     * 序列化实体类 
     */  
    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;  
    }  
  
    /** 
     * 将实体类数据写入Parcel 
     */  
    @Override  
    public void writeToParcel(Parcel parcel, int flags) {  
        parcel.writeString(name);  
        parcel.writeInt(age);  
    }  
  
}  

第二步:传递序列化对象;

Intent intent = new Intent(MainActivity.this, DestActivity.class);  
Bundle bundle = new Bundle();  
switch (v.getId()) {  
case R.id.serializable_btn:  
    // Serializable传递对象  
    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传递对象  
    PersonPar personPar = new PersonPar();  
    personPar.setName("snail");  
    personPar.setAge(27);  
    // Bundle有putParcelableArray和putParcelableArrayList方法,也就可以传递数组和列表  
    bundle.putParcelable(PAR_KEY, personPar);  
    intent.putExtra("type", PAR_TYPE);  
    // Intent也有putParcelableArrayListExtra方法,可以传递实现Parcelable接口的对象列表  
    intent.putExtras(bundle);  
    startActivity(intent);  
    break;  
}  

第三步:获取对象;

StringBuffer sb = new StringBuffer();  
String type = getIntent().getStringExtra("type");  
// 根据type判断是哪种类型  
if (type.equals(MainActivity.SER_TYPE)) {  
    // 获取Serializable对象  
    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对象  
    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");  
}  

附源码:下载地址

运行结果截图:





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值