logo头像
Snippet 博客主题

Android-使用Intent传递对象

本文于1166天之前发表,文中内容可能已经过时。

####使用Intent传递对象

Intent可以用来启动活动、发送广播、启动服务等,也可以在Intent中添加一个附加数据。
FirtActivity中添加如下代码:

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

这里调用了IntentputExtra()方法添加要传递的数据,之后再SecondActivity中就可以得到这些值

1
2
getIntent.getStringExtra("string_data);
getIntent.getStringExtra("int_data", 0);

#####传递的类型是有限的,可以用两种来实现,Serializable和Parcelable
1、Serializable是序列化的意思,表示将一个对象转换成可存储或可传输的状态。序列化后的对象可以在网络上进行传输,也可以存储到本地。之于序列化的方法也很简单,只需让一个类是实现Serializable这个接口就可以了.
一个Person类,包含nameage两个字段,要将其序列化,可以这么写:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Person implements Serializable {
private String name;
private int age;

public String getName() {
return name;
}

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

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}
}

接下来在FirstActivity中的写法很简单:

1
2
3
4
5
6
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的实例,然后就直接把它传入到putExtra()方法中。接下来获取这个对象也很简单:

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

2、Parcelable方式,不同上面的方法,Parcelable实现原理是将一个完整的对象进行分解,而分解后的每一部分都是Intent所支持的数据类型,这样也就实现传递对象的功能了。
修改Person中的代码:

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
46
public class Person implements Parcelable {
private String name;
private int age;

public String getName() {
return name;
}

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

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

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

@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeInt(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();
person.age = source.readInt();
return person;
}

@Override
public Person[] newArray(int size) {
return new Person[size];
}
};
}

接下来在FirstActivity中我们仍然可以使用相同的代码来传递Person对象,在SecondActivity中获取对象的时候需要修改:

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

以上

#####Serializable因为要把整个对象序列化,效率方面会比Parcelable方式低一点。

评论系统未开启,无法评论!