在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廣泛全部的,兼容性更好一點。
至於使用哪一種方法,並無必定的成規可循,要根據實際狀況而定。