Android 主要是经过Intent来实现组件之间的相互调用,同时还能够传递附加的数据。这些数据主要是存储在Bundle之中(当调用Intent.putExtras(Bundle)时,Android会复制Bundle中的数据,而不是引用,所以再修改Bundle中的数据并不会改变Intent中携带的数据)。 java
Bundle之中能够存放基本数据类型以及实现了Serializable或Parcelable接口的类。 ide
当咱们要向Bundle中存放一个类Obj(包含两个int成员的简单类),能够让它实现Serializable或Parcelable接口,以下所示: 性能
1.Serializable 测试
public class Obj implements Serializable { private int a; private int b; public Obj(int a, int b) { this.a = a; this.b = b; } @Override public String toString() { return "Obj: [" + a + ", " + b + "]"; } }咱们能够经过intent.putExtra("obj", new Obj(1, 2));来将其放入intent中,而后经过 obj = (Obj) intent.getSerializableExtra("obj");来将其取出。
2.Parcelable 网站
public class ObjPar implements Parcelable { private int a; private int b; public ObjPar(int a, int b) { this.a = a; this.b = b; } @Override public String toString() { return "Obj: [" + a + ", " + b + "]"; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(a); dest.writeInt(b); } public static final Parcelable.Creator<ObjPar> CREATOR = new Creator<ObjPar>() { @Override public ObjPar[] newArray(int size) { return new ObjPar[size]; } @Override public ObjPar createFromParcel(Parcel source) { return new ObjPar(source.readInt(), source.readInt()); } }; }咱们能够经过intent.putExtra("objpar", new ObjPar(1, 2));来将其放入intent中,而后经过 objpar = (ObjPar) intent.getParcelableExtra("objpar"); 来将其取出。
以上是两种向Bundle中存放Object对象的方法,明显能够看出实现Serializable接口更加简单,由于他是一个标记性的接口,并不须要实现某个具体方法。相比而言实现Parcelable接口就显得相对复杂一些,但这样带来的好处是性能的大幅提升。这是由于当咱们实现Serializable接口后,真正的序列化工做是由JDK来完成,他须要经过反射来获取成员变量,由于反射的性能并不高,所以这种序列化方式速度慢。然而实现Parcelable接口时,咱们提供了该接口中定义方法的实现(writeToParcel实现序列化,createFromParcel实现反序列化),这就避免了反射的使用,所以这种方式速度快。 this
那么这两种方式,性能差异有多大呢?下面是国外网站上的一个测试结果:Serializable耗时是Parcelable的10倍左右 spa