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

来源:互联网 发布:js截取字符串的方法 编辑:程序博客网 时间:2024/05/02 04:23

说明:

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

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

startActivity()传递:

    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;      }  

startActivityForResult()传递:

case R.id.rl_customer_id:    startActivityForResult(new Intent(DlxfNewBuildXzActivity.this, DlxfCustomerActivity.class), REQUEST_TO_CUSTOMER);    break;

@Overridepublic void onClick(View v) {    switch (v.getId()) {        case R.id.ll_back:            Intent intent = new Intent();            SerializableMap map = new SerializableMap();            Map map1 = new HashMap();            map1.put("ID",21);            map1.put("NAME","假数据");            map.setMap(map1);            Bundle bundle = new Bundle();            bundle.putSerializable(REQUEST_TO_MAP, map);            intent.putExtras(bundle);            setResult(RESULT_OK, intent);            finish();            break;    }}

第三步:获取对象;

startActivity()获取:

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

startActivityForResult()获取:

@Overridepublic void onActivityResult(int requestCode, int resultCode, Intent data) {    super.onActivityResult(requestCode, resultCode, data);    if (resultCode != RESULT_OK) {        return;    }    switch (requestCode) {        case REQUEST_TO_CUSTOMER:            if (data != null) {               Bundle bundle = data.getExtras();                SerializableMap serializableMap = (SerializableMap) bundle.getSerializable(DlxfCustomerActivity.REQUEST_TO_MAP);                int customerId = (int) serializableMap.getMap().get("ID");                String customerName = (String) serializableMap.getMap().get("NAME");                tv_customer_id.setText(customerName);                requestBuildingData(customerId);                UiUtils.showToast(serializableMap.getMap().get("ID")+"");            }            break;        default:            break;    }

感谢另一篇文章的总结,自己加了点自己的东西做记录。

1 0
原创粉丝点击