android学习笔记——使用Intent传递对象

来源:互联网 发布:淘宝模特工资一般多少 编辑:程序博客网 时间:2024/05/29 13:12
我们在使用Intent时,有时会使用Intent来传递一些简单的数据类型的值,如下的方式:

Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("string_data", "hello");
intent.putExtra("int_data", 100);
startActivity(intent);

在获取传递过来的数据时,利用键值对的方式拿出数据:

getIntent().getStringExtra("string_data");
getIntent().getIntExtra("int_data", 0);

那么当我们需要传递一些对象类型的数据时,又该怎么办呢?

我们提供以下两种方式来传递对象数据
  • Serializable方式
  • Parcelable方式

Serializable方式
serializable是序列化的意思,表示将一个对象转换成可存储或可传输的状态。序列化后的对象可以在网络上进行传输,也可以存储到本地。而序列化的使用方式非常简单。在实体类方面,只需要实现serializable接口即可。
发送端:
Person person = new Person();
person.setName("Tom");
person.setAge(20);
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("person_data", person);
startActivity(intent);
接收端:
Person person = (Person) getIntent().getSerializableExtra("person_data");
调用getSerializableExtra()方法获取通过参数传递过来的序列化对象,然后将它下转型成Person对象,这样就成功的将对象通过Intent传递过来了。


Parcelable方式
Parcelable方式的实现原理是将一个完整的对象进行分解,而分解后的每一部分都是Intent所支持的数据类型,这样也就实现了传递对象的功能了。

我们先来看一下实体类需要做哪些事情
public class Person implementsParcelable {
private String name;
private int age;
……
@Override
public int describeContents() {
     return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
     dest.writeString(name); //写出name
     dest.writeInt(age); //写出age
}
public static final Parcelable.Creator<Person> CREATOR = new Parcelable.
Creator<Person>() {
@Override
public Person createFromParcel(Parcel source) {
     Person person = new Person();
     person.name = source.readString(); //读取name
     person.age = source.readInt(); //读取age
     return person;
          }
@Override
public Person[] newArray(int size) {
     return new Person[size];
}
};
}
我们在实现了Parcelable接口时,必须重写describeContents() 方法和 writeToParcel() 方法。其中describeContents()方法直接返回0就可以了,而writeToParcel()方法中我们需要调用Parcel 的 writeXXX()方法将Person的字段一一写出。

除此之外,我们还必须在Person 类中提供一个名为 CREATOR 的常量,这里创建了Parcelable.Creator 接口的一个实现, 并将泛型指定为 Person。 接着需要重写 createFromParcel()和 newArray()这两个方法, 在 createFromParcel()方法中我们要去读取刚才写出的 name 和 age字段,并创建一个 Person 对象进行返回,其中 name 和 age 都是调用 Parcel 的 readXxx()方法读取到的,注意这里读取的顺序一定要和刚才写出的顺序完全相同。而 newArray()方法中的实现就简单多了,只需要new 出一个 Person 数组,并使用方法中传入的 size 作为数组大小就可以了。

接收端:
Person person = (Person) getIntent().getParcelableExtra("person_data");


对比一下, Serializable的方式较为简单,但由于会把整个对象进行序列化,因此效率方面会比Parcelable 方式低一
些,所以在通常情况下还是更加推荐使用Parcelable的方式来实现 Intent 传递对象的功能。
0 0
原创粉丝点击