在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
- 在Android中通过Intent使用Bundle传递对象
- 在Android中通过Intent使用Bundle传递对象
- 在Android中通过Intent使用Bundle传递对象
- 在Android中通过Intent使用Bundle传递对象
- 在Android中通过Intent使用Bundle传递对象
- 在Android中通过Intent使用Bundle传递对象
- 在Android中通过Intent使用Bundle传递对象
- android 通过Intent使用Bundle传递对象
- Android--通过Intent使用Bundle如何传递对象
- Android中intent传递对象和Bundle的用法
- Android中intent传递对象和Bundle的用法
- Android中intent传递对象和Bundle的用法
- Android中intent传递对象和Bundle的用法
- Android中intent传递对象和Bundle的用法
- Android中intent传递对象和Bundle的用法
- Android中通过Intent来传递对象
- Android Intent.bundle 在activity中一对一传递数据
- 使用Intent 利用bundle传递对象
- 【第十一周项目1 - 二叉树算法验证(1)】
- NOIP 2014 - 提高组 寻找道路
- DOM4J方式解析、创建XML文件(实例)
- PowerSinger之Java环境配制
- 第10周项目1-二叉树算法库
- 在Android中通过Intent使用Bundle传递对象
- 深入了解UART
- nginx--rbtree使用详解
- 第11周项目1 验证算法(2)二叉树构造算法的验证
- 二分图——图的割点
- win10 开机自动启动安装进度命令框禁止加载
- EvnetBus3.0的使用
- 第十一周项目1—层次遍历的算法
- [BZOJ1293][SCOI2009]生日礼物(单调队列)