当前位置: 移动技术网 > 移动技术>移动开发>Android > 在Android中通过Intent使用Bundle传递对象的使用方法

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

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

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

运行结果截图:

附源码:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网