Android 序列化對象介面Parcelable使用方法,androidparcelable
什麼是Parcelable ?
Parcelable,定義了將資料寫入Parcel,和從Parcel中讀出的介面。一個實體(用類來表示),如果需要封裝到訊息中去,就必須實現這一介面,實現了這一介面,該實體就成為“可打包的”了。
Parcelable 傳遞對象
Android序列化對象主要有兩種方法:
1.實現Serializable介面,實現Serializable介面是JavaSE本身就支援的;
2.實現Parcelable介面,Parcelable是Android特有的功能,效率比實現Serializable介面高,像用於Intent資料傳遞也都支援,而且還可以用在處理序間通訊(IPC),
除了基本類型外,只有實現了Parcelable介面的類才能被放入Parcel中。
Parcelable介面定義
[java] view plaincopyprint?
- public interface Parcelable {
- //內容描述介面,基本不用管
- public int describeContents();
- //寫入介面函數,打包
- public void writeToParcel(Parcel dest, int flags);
- //讀取介面,目的是要從Parcel中構造一個實現了Parcelable的類的執行個體處理。因為實作類別在這裡還是不可知的,所以需要用到模板的方式,繼承類名通過模板參數傳入。
- //為了能夠實現模板參數的傳入,這裡定義Creator嵌入介面,內含兩個介面函數分別返回單個和多個繼承類執行個體。
- public interface Creator<T> {
- public T createFromParcel(Parcel source);
- public T[] newArray(int size);
- }
實現Parcelable介面?
從parcelable介面定義中,我們可以看到,實現parcelable介面,需要我們實現下面幾個方法:
1.describeContents方法。內容介面描述,預設返回0就可以;
2.writeToParcel 方法。該方法將類的資料寫入外部提供的Parcel中.即打包需要傳遞的資料到Parcel容器儲存,以便從parcel容器擷取資料,該方法聲明如下:
writeToParcel (Parcel dest, int flags) 具體參數含義見javadoc
3.靜態Parcelable.Creator介面,本介面有兩個方法:
createFromParcel(Parcel in) 從Parcel容器中讀取傳遞資料值,封裝成Parcelable對象返回邏輯層。
newArray(int size) 建立一個類型為T,長度為size的數組,僅一句話(return new T[size])即可。方法是供外部類還原序列化本類數組使用。
代碼實現
1.封裝資料,把實現parcelable介面的Person對象傳遞到TwoActivity裡;
[java] view plaincopyprint?
- public class DemoActivity extends Activity {
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- // 封裝資料
- Person p = new Person();
- p.setId(1);
- p.setName("xiaoming");
- // 用Intent傳遞Person對象
- Intent i = new Intent(this, TwoActivity.class);
- i.putExtra("Person", p);
- startActivity(i);
- }
- }
2.TwoActivity擷取資料,從DemoActivity傳遞的Person對象給解析,並列印;
[java] view plaincopyprint?
- public class TwoActivity extends Activity {
-
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
-
- Person p = (Person)getIntent().getParcelableExtra("Person");
-
- System.out.println("p_id"+p.getId());
- System.out.println("p_name"+p.getName());
- }
- }
3.parcelable介面的實現
[java] view plaincopyprint?
- public class Person implements Parcelable{
-
- // 成員變數
- private int id;
- private String name;
-
- // 1.必須實現Parcelable.Creator介面,否則在擷取Person資料的時候,會報錯,如下:
- // android.os.BadParcelableException:
- // Parcelable protocol requires a Parcelable.Creator object called CREATOR on class com.um.demo.Person
- // 2.這個介面實現了從Percel容器讀取Person資料,並返回Person對象給邏輯層使用
- // 3.實現Parcelable.Creator介面對象名必須為CREATOR,不如同樣會報錯上面所提到的錯;
- // 4.在讀取Parcel容器裡的資料事,必須按成員變數聲明的順序讀取資料,不然會出現擷取資料出錯
- // 5.還原序列化對象
- public static final Parcelable.Creator<Person> CREATOR = new Creator(){
-
- @Override
- public Person createFromParcel(Parcel source) {
- // TODO Auto-generated method stub
- // 必須按成員變數聲明的順序讀取資料,不然會出現擷取資料出錯
- Person p = new Person();
- p.setId(source.readInt());
- p.setName(source.readString());
- return p;
- }
-
- @Override
- public Person[] newArray(int size) {
- // TODO Auto-generated method stub
- return new Person[size];
- }
- };
-
- public int getId() {
- return id;
- }
-
- public void setId(int id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- @Override
- public int describeContents() {
- // TODO Auto-generated method stub
- return 0;
- }
-
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- // TODO Auto-generated method stub
- // 1.必須按成員變數聲明的順序封裝資料,不然會出現擷取資料出錯
- // 2.序列化對象
- dest.writeInt(id);
- dest.writeString(name);
- }
- }