欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2024-03-01 10:15:46
android 通过intent使用bundle传递对象 android开发中有时需要在应用中或进程间传递对象,下面详细介绍intent使用bundle传递对象的方法。...

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

附源码:下载地址

运行结果截图:

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

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

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