Android Activity之间传递对象及对象数组

7 阅读2分钟

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

publicclass People{ 

publicString strName; 

publicint iAge; 

publicPeople(String strName,intiAge){ 

this.strName = strName; 

this.iAge = iAge; 

publicString getName(){ 

returnstrName; 

publicint getAge(){ 

returniAge; 

方法一:Serializable 

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

publicclass People implementsSerializable{ 

privatestatic final long serialVersionUID = 1L; 

publicString strName; 

publicint iAge; 

publicPeople(String strName,intiAge){ 

this.strName = strName; 

this.iAge = iAge; 

publicString getName(){ 

returnstrName; 

publicint getAge(){ 

returniAge; 

传递对象: 

传递端: 

People people = newPeople("John",21); 

Intent intent = newIntent(SendActivity.this,RcvActivity.class); 

Bundle bundle = newBundle(); 

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 = newArrayList(); 

people.add(newPeople("John",21)); 

people.add(newPeople("Amy",20)); 

Bundle bundle = newBundle(); 

bundle.putSerializable("people", (Serializable) people); 

Intent intent = newIntent(SendActivity.this, RcvActivity.class); 

intent.putExtras(bundle); 

startActivity(intent); 

接收端: 

List resultList = (List) 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接口 

publicclass People implementsParcelable { 

publicString strName; 

publicint iAge; 

publicPeople(String strName,intiAge){ 

this.strName = strName; 

this.iAge = iAge; 

publicString getName(){ 

returnstrName; 

publicint getAge(){ 

returniAge; 

@Override 

publicint describeContents() { 

// TODO Auto-generated method stub 

return0; 

@Override 

publicvoid writeToParcel(Parcel parcel, intarg1) { 

// TODO Auto-generated method stub 

parcel.writeString(strName); 

parcel.writeInt(iAge); 

publicstatic final Parcelable.Creator CREATOR = newCreator() { 

publicPeople createFromParcel(Parcel source) { 

People pTemp = newPeople("",0); 

pTemp.strName = source.readString(); 

pTemp.iAge = source.readInt(); 

returnpTemp; 

publicPeople[] newArray(intsize) { 

returnnew People[size]; 

}; 

传递对象: 

传递端: 

People people = newPeople("John",21); 

Intent intent = newIntent(SendActivity.this,RcvActivity.class); 

Bundle bundle = newBundle(); 

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 = newArrayList(); 

People.add(newPeople("John",21)); 

People.add(newPeople("Amy",20)); 

Intent intent = newIntent(SendActivity.this,RcvActivity.class); 

Bundle bundle = newBundle(); 

bundle.putParcelableArrayList("People", (ArrayList) People); 

intent.putExtras(bundle); 

startActivity(intent); 

接收端: 

List 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 CREATOR。 

区别:

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

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

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

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