当前位置: 代码迷 >> Android >> 在Android中经过Intent使用Bundle传递对象
  详细解决方案

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

热度:75   发布时间:2016-05-01 11:11:49.0
在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");}

附源码:下载地址

运行结果截图:



  相关解决方案