在Android开发过程当中,常常要在Activity之间传递参数,使用Android系统提供的方法能够传递基本数据类型的变量,但有时候咱们常常要传递一些复杂的数据类型或自定义的类,这种状况的参数没法直接传递,咱们能够经过序列化实现。java
一、使用Pacelable接口,重写Parcelable接口中的两个方法和静态变量CREATORandroid
自定义类MyClass、MyClassA、MyClassBide
MyClassA:this
public class MyClass implements android.os.Parcelable { private String a = null; private int b = 0; private MyClassA myClassA = new MyClassA; private List<MyClassB> myClassB = new ArrayList<MyClassB>(); public MyClass(Parcel parcel) { // 按变量定义的顺序读取 a = parcel.readString(); b = parcel.readInt(); myClassA = parcel.readParcelable(MyClassA.class.getClassLoader()); Parcelable[] pars = parcel.readParcelableArray(MyClassB.class.getClassLoader()); myClassB = Arrays.asList(Arrays.asList(pars).toArray(new MyClassB[pars.length])); } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { // 按变量定义的顺序写入 dest.writeString(a); dest.writeString(b); dest.writeParcelable(myClassA, flags); dest.writeParcelableArray((myClassB.toArray(new MyClassB[myClassB.size()])), flags); } public static final Parcelable.Creator<MyClass> CREATOR = new Parcelable.Creator<MyClass>() { @Override public Param createFromParcel(Parcel source) { return new MyClass(source); } @Override public MyClass[] newArray(int size) { return new MyClass[size]; } }; }
MyClassA、MyClassB实现方法同上。spa
TestActivity.java:code
MyClass myClass = new MyClass("a", "b", new MyClassA(), new ArrayList<MyClassB>()); Intent intent = new Intent(this, ParcelableActivity.class); Bundle bundle = new Bundle(); bundle.putParcelable("key", myClass); intent.putExtras(bundle); startActivity(intent);
ParcelableActivity.java:接口
MyClass myClass = (MyClass)getIntent().getParcelableExtra("key"); Log.d("ParcelableActivity", myClass.a);
二、使用Serializable接口,定义序列化ID开发
自定义类MyClass、MyClassA、MyClassBget
MyClassA:it
public class MyClass implements java.io.Serializable { private static final long serialVersionUID = 1L; // 定义序列化ID private String a = null; private int b = 0; private MyClassA myClassA = new MyClassA; private List<MyClassB> myClassB = new ArrayList<MyClassB>(); }
MyClassA、MyClassB实现方法同上。
MyClass myClass = new MyClass("a", "b", new MyClassA(), new ArrayList<MyClassB>()); Intent intent = new Intent(this, SerializableActivity.class); Bundle bundle = new Bundle(); bundle.putSerializable("key", myClass); intent.putExtras(bundle); startActivity(intent);
MyClass myClass = (MyClass)getIntent().getSerializableExtra("key"); Log.d("SerializableActivity", myClass.a);
相比之下,使用Parcelable接口更高效,可是须要实现部分方法,使用Serializable接口更方便,只须要定义一个序列化ID,可是效率比较低。
另外,Parcelable接口为Android特有的,Serializable接口是jre广泛全部的,兼容性更好一点。
至于使用哪一种方法,并无必定的成规可循,要根据实际状况而定。