第一行代码-13.2 使用Intent传递对象

来源:互联网 发布:软件测试的基础理论 编辑:程序博客网 时间:2024/06/08 12:01

  使用Intent传递一般类型的数据比较简单,只要通过intent.putExtra(key, value)就可以实现,但是怎么传递自定义类型的数据,就需要使用一些技巧了。
  1、Serializable方式
  Serializable 是序列化的意思,表示将一个对象转换成可存储或可传输的状态。序列化后的对象可以在网络上进行传输,也可以存储到本地。至于序列化的方法也很简单,只需要让一个类去实现Serializable 这个接口就可以了。
  下面我们创建Student类,继承Serializable。

public class Student implements Serializable{    private String name;    private String number;    public void setName(String name) {        this.name = name;    }     public void setNumber(String number) {        this.number = number;    }    public String getName() {        return name;    }    public String getNumber() {        return number;    }}

  然后就可以用Intent.putExtra来插入Student对象了:

mBSecondActivity.setOnClickListener(new View.OnClickListener() {    @Override    public void onClick(View v) {        Intent intent = new Intent(MainActivity.this, SecondActivity.class);        Student student = new Student();        student.setName("Curry");        student.setNumber("30");        intent.putExtra("student_data", student);        startActivity(intent);    }});  

  然后在SecondActivity中获取这个Student对象:

Student student = (Student) getIntent().getSerializableExtra("student_data");

  2、Parcelable方式
  和Serializable方式不同在于,Parcelable 方式的实现原理是将一个完整的对象进行分解,而分解后的每一部分都是Intent 所支持的数据类型,这样也就实现传递对象的功能了。但是它的实现过程比较复杂,下面先创建Person类,并继承Parcelable接口。

public class Person implements Parcelable{    private String name;    private int age;    public void setName(String name) {        this.name = name;    }    public void setAge(int age) {        this.age = age;    }    public String getName() {        return name;    }    public int getAge() {        return age;    }    public static final Creator<Person> CREATOR = new Creator<Person>() {        @Override        public Person createFromParcel(Parcel in) {            Person person = new Person();            person.setName(in.readString());            person.setAge(in.readInt());            return person;        }        @Override        public Person[] newArray(int size) {            return new Person[size];        }    };    @Override    public int describeContents() {        return 0;    }    @Override    public void writeToParcel(Parcel dest, int flags) {        dest.writeString(name);        dest.writeInt(age);    }}

  Parcelable 的实现方式要稍微复杂一些。可以看到,首先我们让Person 类去实现了Parcelable 接口,这样就必须重写describeContents()和writeToParcel()这两个方法。其中describeContents()方法直接返回0 就可以了,而writeToParcel()方法中我们需要调用Parcel的writeXxx()方法将Person 类中的字段一一写出。注意字符串型数据就调用writeString()方法,整型数据就调用writeInt()方法,以此类推。
  除此之外,我们还必须在Person 类中提供一个名为CREATOR 的常量,这里创建了Parcelable.Creator 接口的一个实现,并将泛型指定为Person。接着需要重写createFromParcel()和newArray()这两个方法,在createFromParcel()方法中我们要去读取刚才写出的name 和age字段,并创建一个Person 对象进行返回,其中name 和age 都是调用Parcel 的readXxx()方法读取到的,注意这里读取的顺序一定要和刚才写出的顺序完全相同。而newArray()方法中的实现就简单多了,只需要new 出一个Person 数组,并使用方法中传入的size 作为数组大小就可以了。
  在SecondActivity中获取对象的方式差不多,如下:

Person person = (Person) getIntent().getParcelableExtra("person_data");

  总结:虽然序列化的方式比较简单,但是由于会将整个对象序列化,所以效率方面会比Parcelable方法低一些。所以在通常情况下还是更加推荐使用Parcelable 的方式来实现Intent 传递对象的功能。

0 0