《Android》『Parcelable』- Parcelable 序列化的基本用法
《Android Developers 參考文獻》
《簡單介紹》
之前已經介紹過在 android 中,常用的兩種序列化 Serializable 與 Parcelable 的基本觀念,這邊直接以範例程式碼的方式,說明 Parcelable 的實際用法。
《用法介紹》
我們首先自訂了三個類別,分別命名為 ItemBean、ItemPracelabel 以及 ItemSerializable,其中 ItemBean 用來當作我們這次範例主要要透過 intent 由 A Activity 傳遞至 B Activity 的資料,ItemPracelabel 與 ItemSerializable 則為將要放入 ItemBean 當中一起傳輸的資料類別,三個類別定義如下 –
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 |
package com.example.xylonchen.parcelablesample; import android.os.Parcel; import android.os.Parcelable; import java.io.Serializable; import java.util.ArrayList; public class ItemBean implements Parcelable { /** int 類型 */ int age; /** String 類型 */ String name; /** boolean 注意該boolean的get和set方法 **/ boolean isGood; /** boolean 類型 **/ boolean complete; /** 數組 **/ private String[] ids; /** 對象 [內部已經序列化] **/ private ItemParcelable bean; /** list **/ private ArrayList listBeans; private Serializable serializable; /** * 默認建構子 */ public ItemBean() { // TODO Auto-generated constructor stub } /*** * 默認實現 */ @Override public int describeContents() { // TODO Auto-generated method stub return 0; } public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { @Override public ItemBean createFromParcel(Parcel in) { ItemBean itemBean = new ItemBean(); itemBean.setAge(in.readInt()); itemBean.setName(in.readString()); itemBean.setIsGood((in.readInt() == 1) ? true : false); itemBean.setComplete((in.readInt() == 1) ? true : false); itemBean.setIds(in.createStringArray()); itemBean.setBean((ItemParcelable)in.readParcelable(ItemParcelable.class.getClassLoader())); itemBean.setListBeans(in.readArrayList(ItemParcelable.class.getClassLoader())); itemBean.setSerializable(in.readSerializable()); return itemBean; } public ItemBean[] newArray(int size) { return new ItemBean[size]; } }; @Override public void writeToParcel(Parcel dest, int flags) { /** int 寫入 **/ dest.writeInt(age); /** string 寫入 **/ dest.writeString(name); /** boolean 寫入 **/ dest.writeInt(isGood ? 1 : 0); /** boolean 寫入 **/ dest.writeInt(complete ? 1 : 0); /** 數組 寫入 **/ dest.writeStringArray(ids); /** 對象 寫入 **/ dest.writeParcelable(bean, flags); /** list 寫入 **/ dest.writeList(listBeans); /** serializable 寫入 **/ dest.writeSerializable(serializable); } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } /** * * 功能描述: * 〈功能詳細描述〉 fastJson解析時需要格式 */ public boolean isIsGood() { return isGood; } public void setIsGood(boolean isGood) { this.isGood = isGood; } public boolean isComplete() { return complete; } public void setComplete(boolean complete) { this.complete = complete; } public String[] getIds() { return ids; } public void setIds(String[] ids) { this.ids = ids; } public ItemParcelable getBean() { return bean; } public void setBean(ItemParcelable bean) { this.bean = bean; } public ArrayList getListBeans() { return listBeans; } public void setListBeans(ArrayList listBeans) { this.listBeans = listBeans; } public Serializable getSerializable() { return serializable; } public void setSerializable(Serializable serializable) { this.serializable = serializable; } } |
ItemBean.java
將 ItemBean 類別去實作 Parcelable 介面,主要要改寫兩個方法,分別是 writeToParcel() 以及 createFromParcel() ,我們在 writeToParcel() 中將傳入的資料寫進 Parcel 參數,接著在 createFromParcel() 中將剛剛寫入的參數依序存回 itemBean 物件並回傳此物件,這邊要注意的是寫入參數的順序要依照每個參數宣告的順序,不然會出錯。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
package com.example.xylonchen.parcelablesample; import java.io.Serializable; public class ItemSerializable implements Serializable { /** int 類型 */ int age; /** String 類型 */ String name; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } } |
ItemSerializable.java
ItemSerializable 代表一個實作了 Serializable 序列化的類別資料,我們將這個類別當作 ItemBean 中的一個參數傳入。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
package com.example.xylonchen.parcelablesample; import android.os.Parcel; import android.os.Parcelable; public class ItemParcelable implements Parcelable { /** int 類型 */ int age; /** String 類型 */ String name; public static final Creator<ItemParcelable> CREATOR = new Creator<ItemParcelable>() { @Override public ItemParcelable createFromParcel(Parcel in) { ItemParcelable itemParcelable = new ItemParcelable(); itemParcelable.setAge(in.readInt()); itemParcelable.setName(in.readString()); return itemParcelable; } @Override public ItemParcelable[] newArray(int size) { return new ItemParcelable[size]; } }; @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel parcel, int i) { /** int 寫入 **/ parcel.writeInt(age); /** string 寫入 **/ parcel.writeString(name); } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } } |
ItemParcelable.java
ItemParcelable 代表一個實作了 Parcelable 序列化的類別資料,我們將這個類別當作 ItemBean 中的一個參數傳入。
設定好上面相關資料後,現在我們來實作兩個 Activity,並在這兩個 Activity 之間傳遞 ItemBean 這個類別所產生的物件,程式碼如下 –
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
package com.example.xylonchen.parcelablesample; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import java.util.ArrayList; public class MainActivity extends AppCompatActivity { private String[] note_array = {"itme 1", "itme 2", "itme 3", "itme 4"}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //Parcelable Item 1 ItemParcelable itemParcelable1 = new ItemParcelable(); itemParcelable1.setAge(20); itemParcelable1.setName("Xavier"); //Parcelable Item 2 ItemParcelable itemParcelable2 = new ItemParcelable(); itemParcelable2.setAge(40); itemParcelable2.setName("Nina"); //Parcelable Item List. ArrayList<ItemParcelable> arrayList = new ArrayList<>(); arrayList.add(itemParcelable1); arrayList.add(itemParcelable2); //Normal data Item. ItemSerializable itemSerializable = new ItemSerializable(); ItemSerializable.setAge(100); ItemSerializable.setName("Jack"); //ItemBean setting ItemBean itemBean = new ItemBean(); itemBean.setAge(10); itemBean.setComplete(true); itemBean.setIds(note_array); itemBean.setBean(itemParcelable1); itemBean.setListBeans(arrayList); itemBean.setSerializable(itemSerializable); Intent intent = new Intent(MainActivity.this, OtherActivity.class); intent.putExtra("ItemInfo", itemBean); startActivity(intent); } } |
MainActivity.java
首先在 MainActivity 中,宣告一個基於 ItemBean 類別的物件 itemBean,接著設定好其中的資料參數後,透過 Intent.putExtra() 的方式,在呼叫 OtherActivity 時將 itemBean 物件一起傳遞過去。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
package com.example.xylonchen.parcelablesample; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import java.util.ArrayList; public class OtherActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_other); Intent i = getIntent(); ItemBean itemBean = (ItemBean) i.getParcelableExtra("ItemInfo"); if (itemBean != null) { ItemNormal itemNormal = (ItemNormal)itemBean.getSerializable(); ItemParcelable itemParcelable = itemBean.getBean(); ArrayList<ItemParcelable> arrayList = itemBean.getListBeans(); String[] array = itemBean.getIds(); int age = itemBean.getAge(); String name = itemBean.getName(); } } } |
OtherActivity.java
接著在 OtherActivity 中,就可以順利的接收並解析資料了,透過這種方式,除了基本型別的資料,就連被序列化過的資料也可以正常傳遞。
臉書留言
一般留言