您的位置:首页 > 编程语言

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

2016-03-03 00:05 465 查看
  使用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 传递对象的功能。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: