putextra 传递对象_Android -- Intent传递对象的三种方法

当我们使用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 CREATOR = new Parcelable.Creator(){

@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 包上传到我的百度云盘,有需要的可以去下载

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值