当前位置: 移动技术网 > IT编程>移动开发>Android > Android 通过Intent使用Bundle传递对象详细介绍

Android 通过Intent使用Bundle传递对象详细介绍

2019年07月24日  | 移动技术网IT编程  | 我要评论

zuoyuewang,金赛纶丑闻,全频段对讲机

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

附源码:

运行结果截图:

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网