您的位置:首页 > 移动开发 > Android开发

在Android中通过Intent使用Bundle传递对象

2015-01-23 11:09 465 查看

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

/**

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

[java] view plaincopy

/**

* 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);

}

}

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

[java] view plaincopy

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;

}

第三步:获取对象;

[java] view plaincopy

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");

}

附源码:下载地址

运行结果截图:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: