Android在多个Activity间传递对象及对象数组

假设对象为People类,包含信息姓名和年龄:

public class People{
	public String strName;
	public int iAge;
	public People(String strName,int iAge){
		this.strName = strName;
		this.iAge = iAge;
	}
	public String getName(){
		return strName;
	}
	public int getAge(){
		return iAge;
	}
}

方法一:Serializable

必须条件:类实现了Serializable接口

public class People implements Serializable{

	private static final long serialVersionUID = 1L;
	public String strName;
	public int iAge;
	public People(String strName,int iAge){
		this.strName = strName;
		this.iAge = iAge;
	}
	public String getName(){
		return strName;
	}
	public int getAge(){
		return iAge;
	}
}

传递对象:

传递端:

People people = new People("John", 21);
Intent intent = new Intent(SendActivity.this,RcvActivity.class);
Bundle bundle = new Bundle();
bundle.putSerializable("people", people);

intent.putExtras(bundle);
startActivity(intent);

接收端:

People people = (People) this.getIntent().getSerializableExtra("people");
String strData = people.getName() + " " + people.getAge();
Toast.makeText(getApplication(),strData, Toast.LENGTH_SHORT).show();

传递对象数组:

传递端:

List<People> people = new ArrayList<People>();
people.add(new People("John", 21));
people.add(new People("Amy", 20));

Bundle bundle = new Bundle();
bundle.putSerializable("people", (Serializable) people);

Intent intent = new Intent(SendActivity.this, RcvActivity.class);
				
intent.putExtras(bundle);
startActivity(intent);

接收端:

List<People> resultList = (List<People>) this.getIntent().getSerializableExtra("people");

String strData = "";
for (People p : resultList) {
	strData = strData + p.strName + " " + p.iAge + "\n";
}
Toast.makeText(getApplication(), strData, Toast.LENGTH_SHORT).show();


方法二:Parcelable

必须条件:类实现了Parcelable接口

public class People implements Parcelable {
	public String strName;
	public int iAge;
	public People(String strName,int iAge){
		this.strName = strName;
		this.iAge = iAge;
	}
	public String getName(){
		return strName;
	}
	public int getAge(){
		return iAge;
	}
	@Override
	public int describeContents() {
		// TODO Auto-generated method stub
		return 0;
	}
	@Override
	public void writeToParcel(Parcel parcel, int arg1) {
		// TODO Auto-generated method stub
		parcel.writeString(strName);
		parcel.writeInt(iAge);
	}
	
	public static final Parcelable.Creator<People> CREATOR = new Creator<People>() {
		public People createFromParcel(Parcel source) {
			People pTemp = new People("",0);

			pTemp.strName = source.readString();
			pTemp.iAge = source.readInt();

			return pTemp;
		}

		public People[] newArray(int size) {
			return new People[size];
		}
	};
}

传递对象:

传递端:
People people = new People("John", 21);
Intent intent = new Intent(SendActivity.this,RcvActivity.class);
Bundle bundle = new Bundle();
bundle.putParcelable("people", people);

intent.putExtras(bundle);
startActivity(intent);

接收端:

People people = (People) this.getIntent().getParcelableExtra("people");
String strData = people.getName() + " " + people.getAge();
Toast.makeText(getApplication(),strData, Toast.LENGTH_SHORT).show();

传递对象数组:

传递端:

List<People> People = new ArrayList<People>();
People.add(new People("John", 21));
People.add(new People("Amy", 20));

Intent intent = new Intent(SendActivity.this,RcvActivity.class);
Bundle bundle = new Bundle();
bundle.putParcelableArrayList("People",	(ArrayList<? extends Parcelable>) People);

intent.putExtras(bundle);
startActivity(intent);

接收端:

List<People> resultList = this.getIntent().getExtras()
				.getParcelableArrayList("People");

String strData = "";
for (People p : resultList) {
	strData = strData + p.strName + " " + p.iAge + "\n";
}
Toast.makeText(getApplication(), strData, Toast.LENGTH_SHORT).show();

可以发现在Parcelable中需实现public int describeContents()、      publicvoid writeToParcel(Parcel parcel, int arg1),还需要在添加一个静态成员变量CREATOR:public static final Parcelable.Creator<People> CREATOR。

区别(by: http://www.cnblogs.com/renqingping/archive/2012/10/25/Parcelable.html)

1.Serializable的实现,只需要implements  Serializable即可。这只是给对象打了一个标记,系统会自动将其序列化。

2.Parcelabel的实现,不仅需要implements  Parcelabel,还需要在类中添加一个静态成员变量CREATOR,这个变量需要实现 Parcelable.Creator 接口。

3.在使用内存的时候,Parcelable 类比Serializable性能高,所以推荐使用Parcelable类。4.Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。

5.Parcelable不能使用在要将数据存储在磁盘上的情况,因为在外界有变化的情况下Parcelable不能很好的保证数据的持续性。

 







郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。