Jaqen's Blog

Android Intent 传递自定义对象

字数统计: 533阅读时长: 2 min
2017/08/17 Share

Intent 可以用来启动活动、发送广播、启动服务等,通过 putExtra 方法可以添加一些附加数据,达到传值的效果,但若想传递自定义对象的时候就无能为力了。

可以通过使用 Serializable 接口、Parcelable 接口以及转换对象为字符串的方式进行传递。

1、Serializable

表示将一个对象转为字节实现可存储或可传输的状态,一个对象能够序列化的前提是实现 Serializable 接口。

Model:

1
2
3
4
5
6
7
8
9
10
11
12
public class Person implements Serializable {

private String name;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}

传递对象:

1
2
3
4
5
Person person = new Person();
person.setName("wuzy");
Intent intent = new Intent(MainActivity.this, Main2Activity.class);
intent.putExtra("person_data",person);
startActivity(intent);

接收对象:

1
Person person = (Person) getIntent().getSerializableExtra("person_data");

2、Parcelable

将一个完整的对象进行分解,分解后的每一部分都是 Intent 所支持的数据类型。

Model:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
public class Person implements Parcelable {

private String name;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

@Override
public int describeContents() {
return 0;
}

/*
将想要传递的数据写入到 Parcel 容器中
*/
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeString(name);
}

public static final Creator<Person> CREATOR = new Creator<Person>() {
/*
用于将写入 Parcel 容器中的数据读出来,用读出来的数据实例化一个对象,并且返回
*/
@Override
public Person createFromParcel(Parcel in) {
Person person = new Person();
person.setName(in.readString());
return person;
}

/*
创建一个长度为 size 的数组并且返回,供外部类反序列化本类数组使用
*/
@Override
public Person[] newArray(int size) {
return new Person[size];
}
};
}

传递对象:

1
2
3
4
5
Person person = new Person();
person.setName("wuzy");
Intent intent = new Intent(MainActivity.this, Main2Activity.class);
intent.putExtra("person_data",person);
startActivity(intent);

接收对象:

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

3、转化为 JSON 字符串

Model:

1
2
3
4
5
6
7
8
9
10
public class Person {
private String name;
public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}

传递对象:

1
2
3
4
5
Person person = new Person();
person.setName("wuzy");
Intent intent = new Intent(MainActivity.this, Main2Activity.class);
intent.putExtra("person_data",new Gson().toJson(person));
startActivity(intent);

接受对象:

1
2
String personJson = getIntent().getStringExtra("person_data");
Person person = new Gson().fromJson(personJson, Person.class);

速度上,使用Parcelable 速度最快,Serializable 次之,转换为 JSON 字符串最慢。