您的位置:首页 > 移动开发 > Android开发

Android -- Intent传递对象的三种方法

2017-06-13 20:25 253 查看
最近在做Android的项目,遇到一个问题就是:如何用Intent传递自定义数据类型。找到了这篇文章,还是不错的。

原文:http://www.jianshu.com/p/49851bd6a522

当我们使用
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

GSON : http://pan.baidu.com/s/1nubQw5b
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: