今天刚好看到了Intent的源码,发现它实现了Parcelable接口,突然想起了Java里面还有一个Serializable接口,于是想借此机会谈谈自己对这两个接口的看法。
在安卓里面,我们都知道无法直接把对象传给activity,为了传递对象,这些对象要么必须实现Serializable接口,要么必须实现Parcelable接口。那到底这两者有什么区别呢?我们先来看看 Serializable 接口。
Serializable
先看下Java源码中 Serializable 接口的定义:
package java.io;
public interface Serializable {
}
Serializable 是一个标准的Java接口,从接口定义中我们看到,它位于 java.io 包目录下,没有定义任何方法和变量,只用于确定可序列化的语义。因此我们可以实现这个接口并自己添加方法。但是序列化机制使用了反射去构造序列化对象,因此性能较慢。而且它创建了大量的临时对象,从而造成了相当大的GC,这个接口呢它比较容易实现,我们来看个例子:
class SeObject implements Serializable {
private String name;
private int age;
public SeObject(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
在这里我定义了一个 SeObject,实现了此接口,并定义了一个 name 和 age,实现了构造函数和 getter 方法。打算在activity之间传递这个 SeObject 对象,再来看看第一个activity是如何传递 SeObject 对象的:
public void startActivity(View view) {
Intent intent = new Intent(this, SecondActivity.class);
SeObject seObject = new SeObject("Leon", 28);
Bundle bundle = new Bundle();
bundle.putSerializable("Object", seObject);
intent.putExtras(bundle);
startActivity(intent);
}
首先,在第一个activity的布局里面定义了一个Button,设置 onClick 属性为 startActivity,这样的话点击Button时就会调用上面这个方法。可以看到,我是先定义了一个Bundle,将 SeObject 对象传入 putSerializable 方法,并将 bundle 对象放入 Intent,传递到 SecondActivity,来看看 SecondActivity.java 是如何获取这个 SeObject 对象的:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedI