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

假设对象为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> people = newArrayList<people>();
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<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();
</people></people>


方法二: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<people> CREATOR = newCreator<people>() {
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> People = newArrayList<people>();
People.add(newPeople("John",21));
People.add(newPeople("Amy",20));

Intent intent = newIntent(SendActivity.this,RcvActivity.class);
Bundle bundle = newBundle();
bundle.putParcelableArrayList("People", (ArrayList<!--? extendsParcelable-->) People);

intent.putExtras(bundle);
startActivity(intent);
</people></people>
接收端:

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();
</people>

可以发现在Parcelable中需实现public int describeContents()、 publicvoid writeToParcel(Parcel parcel, int arg1),还需要在添加一个静态成员变量CREATOR:public static final Parcelable.Creator 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不能很好的保证数据的持续性。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是的,这个说法是正确的。在 Android 中,我们可以使用 `Intent` 对象在不同的组件之间传递数据,例如在不同的 `Activity` 之间传递数据。而 `Intent` 对象本身并不能直接传递复杂的数据类型,例如自定义的对象、数组、集合等,因此我们需要使用 `Bundle` 对象将这些数据类型打包后再通过 `Intent` 传递。 `Bundle` 是一个键值对数据结构,类似于 `Map`,可以用来存储不同类型的数据。我们可以通过 `put` 方法将数据存储到 `Bundle` 对象中,然后将 `Bundle` 对象通过 `putExtras()` 方法添加到 `Intent` 对象中。在接收 `Intent` 对象时,可以通过 `getExtras()` 方法获取传递过来的 `Bundle` 对象,再从 `Bundle` 对象中取出之前存储的数据。 以下是一个例子,演示了如何使用 `Bundle` 对象在 `Activity` 之间传递数据: 在发送 `Intent` 时: ```java Intent intent = new Intent(this, TargetActivity.class); Bundle bundle = new Bundle(); bundle.putString("name", "Tom"); bundle.putInt("age", 18); intent.putExtras(bundle); startActivity(intent); ``` 在接收 `Intent` 时: ```java Bundle bundle = getIntent().getExtras(); String name = bundle.getString("name"); int age = bundle.getInt("age"); ``` 可以看到,在发送 `Intent` 时,我们将一个包含字符串和整型数据的 `Bundle` 对象添加到 `Intent` 中;在接收 `Intent` 时,我们通过 `getExtras()` 方法获取传递过来的 `Bundle` 对象,并从中取出之前存储的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值