Android开发中有时需要在应用中或进程间传递对象,下面详细介绍Intent使用Bundle传递对象的方法。
被传递的对象需要先实现序列化,而序列化对象有两种方式:java.io.Serializable和android.os.Parcelable
被传递的对象需要先实现序列化,而序列化对象有两种方式: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");
- }
附源码:下载地址
运行结果截图: