我们知道,当我们在两个activity中传输 实体类对象 的时候有三种方法。第一、实现Serializable接口,这种比较简单,直接声明就好;第二种,实现Parcelable接口,这种方式就比较复杂,往往需要写多些代码去实现,不过效率就比较高;第三种,转换为json传递。
我们先看看实现Serializable接口的方法
首先创建一个实体类,实现serializable接口
public class GirlFriend implements Serializable{
private String name;
private Integer age;
private String location;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
}
然后我们创建两个activity A和B
public class TestActivityA extends Activity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//创建一个按钮
TextView tvClick = new TextView(this);
tvClick.setText("来点我啊,点我获取对象");
setContentView(tvClick);
//创建一个实体类对象
GirlFriend girlF = new GirlFriend();
girlF.setName("喵喵喵");
girlF.setAge(18);
girlF.setLocation("西安培华学院");
//点击传递对象到下一个页面
final Intent intent = new Intent();
Bundle bun = new Bundle();
bun.putSerializable("girlF",girlF);
intent.putExtras(bun);
intent.setClass(this,TestActivityB.class);
tvClick.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(intent);
}
});
}
}
activityB:
public class TestActivityB extends Activity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView textView = new TextView(this);
setContentView(textView);
GirlFriend girlFriend = (GirlFriend) getIntent().getSerializableExtra("girlF");
textView.setText("你获得了一个新女朋友\n名字叫:" +
girlFriend.getName() + "\n年龄为:" + girlFriend.getAge() + "\n现在所在位置:" + girlFriend.getLocation()
);
}
}
这就就实现了我们用serializable来传递对象了。
如果传递的是List<Object>,可以把list强转成Serializable类型,而且object类型也必须实现了Serializable接口
Intent.putExtras(key, (Serializable)list)
接收
(List<Object>)getIntent().getSerializable(key)
实现Parcelabel 接口
首先是我们的实体类
我们先生成 getter setter方法。
然后我们在光标位置按Alt+Insert 会弹出如下菜单:
我们选择Parcelable选项,然后进入我们的变量选择框:
然后点击OK 就为我们生成了完成的Parcelable的代码:
public class GirlFriend implements Parcelable{
private String name;
private Integer age;
private String location;
public String getName() {return name;}
public void setName(String name) {this.name = name;}
public Integer getAge() {return age;}
public void setAge(Integer age) {this.age = age;}
public String getLocation() {return location;}
public void setLocation(String location) {this.location = location;}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(this.name);
dest.writeValue(this.age);
dest.writeString(this.location);
}
public GirlFriend() {
}
protected GirlFriend(Parcel in) {
this.name = in.readString();
this.age = (Integer) in.readValue(Integer.class.getClassLoader());
this.location = in.readString();
}
public static final Creator<GirlFriend> CREATOR = new Creator<GirlFriend>() {
@Override
public GirlFriend createFromParcel(Parcel source) {
return new GirlFriend(source);
}
@Override
public GirlFriend[] newArray(int size) {
return new GirlFriend[size];
}
};
}
接着 我们在Activity中来传递:
还是用我们上面的两个activity ,只需要把A中的 putSerializable 改为 putParcelable 即可。
然后在B中。也是只改接收的那一句:
这样我们的 用parcelable 传递对象也就完成了。
转换为json传递
这种方法里面,我们的实体类GirlFriend 里面 什么接口都不用实现,实现getter setter方法就行。
然后在A中传递时候为:
在B中接收为:
其他的什么都不用改。就完成了这种方式的传递。
为什么选择Parcelable
从上面的两种方法来看。明显的实现Serializable 接口的写法简单。尽管我们用了Android Parcelabel code generator 插件之后 实现Parcelable 接口的写法也简单了许多,但是终归还是比用Serializable 多一步。那么什么时候需要用Parcelable 呢? 那就是 效率!效率!效率!
附上一个别人的测试连接:http://blog.prolificinteractive.com/2014/07/18/why-we-love-parcelable/