当我们使用Intent
在Activity
间传递信息时发现putExtra()
方法并不支持自定义对象的传输,下面就来介绍三种解决方式。
Serializable 方式
这是最简单的一种方法,因为我们要做的就是让我们自定义的对象实现 Serializable
这个空接口。
public class Person implements Serializable{
private String mName;
private String mAddress;
public String getName() {
return mName;
}
public void setName(String name) {
mName = name;
}
public String getAddress() {
return mAddress;
}
public void setAddress(String address) {
mAddress = address;
}
}
这个时候,就已经可以使用Intent
的putExtra()
方法传递这个自定义对象了,在Activity
中这样使用
Person person = new Person();
person.setName("Hwaphon");
person.setAddress("Anhui");
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
intent.putExtra("person",person);
startActivity(intent);
finish();
在Activity
中接收数据
Intent intent = getIntent();
Person person = (Person) intent.getSerializableExtra("person");
使用Serializable
方法虽然十分简单,但是效率却不容乐观,因为它会把整个对象序列化,开销十分大,为了追求效率,我们不得不使用另一种方法,也就是Parcelable
方法。
Parcelable 方式
令自定义类实现Parcelable
接口,这个时候必须重写两个方法
1.describeContents()
: 用于描述内容接口,一般直接 return 0
即可
2.writeToParcel()
: 用于将想要传递的数据写入到Parcel
容器中。
除了这两个方法以外,我们还需要创建一个 Parcelable.Creator
接口的实现,这个接口中也需要我们实现两个方法
1.createFromParcel()
: 用于将写入Parcel
容器中的数据读出来,用读出来的数据实例化一个对象,并且返回。
2.newArray()
:创建一个长度为 size
的数组并且返回,一般而言,直接返回return T[size]
即可。
public class Person implements Parcelable{
private String mName;
private String mAddress;
public String getName() {
return mName;
}
public void setName(String name) {
mName = name;
}
public String getAddress() {
return mAddress;
}
public void setAddress(String address) {
mAddress = address;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeString(mName);
parcel.writeString(mAddress);
}
public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>(){
@Override
public Person createFromParcel(Parcel parcel) {
Person person = new Person();
person.mName = parcel.readString();
person.mAddess = parcel.readString();
return person;
}
@Override
public Person[] newArray(int i) {
return new Person[i];
}
};
}
这个时候的接收方法与Serializable
有点不同,如下
Intent intent = getIntent();
Person person = (Person) intent.getParcelableExtra("person");
在writeToParcel()
方法中,我们可以将我们想要的数据写入容器,如果是我们不需要的数据,那么我们可以放弃写入,这也是Parcelabel
方法比 Serializable
方法高效的原因所在。但是,这种方法比Serializable
方法多了太多的实现代码了,有没有什么办法能改变这一现状呢?可以使用插件一键生成这些代码,比如说 Android Parcelable code generator
插件,可以直接在Android Studio Plugins
去下载该插件,下载完之后 点击 Alt+Insert
就可以看到Parcelable
选项了。
JSON 方式
这个时候自定义对象类为
public class Person{
private String mName;
private String mAdress;
public String getName() {
return mName;
}
public void setName(String name) {
mName = name;
}
public String getAdress() {
return mAdress;
}
public void setAdress(String adress) {
mAdress = adress;
}
}
使用方式
//Send
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
intent.putExtra("person",new Gson().toJson(person));
// Receive
Intent intent = getIntent();
String JsonData = intent.getStringExtra("person");
Person person = new Gson().fromJson(JsonData,Person.class);
在使用时别忘了导入Gson 包
,否则是无法使用的。
附注:
我已将Gson
和 Parcelable code generator JAR
包上传到我的百度云盘,有需要的可以去下载
Parcelable code generator : http://pan.baidu.com/s/1eRmUgLG