Android 序列化對象介面Parcelable使用方法,androidparcelable

來源:互聯網
上載者:User

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?
  1. public interface Parcelable {  
  2.     //內容描述介面,基本不用管  
  3.     public int describeContents();  
  4.     //寫入介面函數,打包  
  5.     public void writeToParcel(Parcel dest, int flags);  
  6.      //讀取介面,目的是要從Parcel中構造一個實現了Parcelable的類的執行個體處理。因為實作類別在這裡還是不可知的,所以需要用到模板的方式,繼承類名通過模板參數傳入。  
  7.     //為了能夠實現模板參數的傳入,這裡定義Creator嵌入介面,內含兩個介面函數分別返回單個和多個繼承類執行個體。  
  8.     public interface Creator<T> {  
  9.            public T createFromParcel(Parcel source);  
  10.            public T[] newArray(int size);  
  11.        }  

實現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?
  1. public class DemoActivity extends Activity {  
  2.     /** Called when the activity is first created. */  
  3.     @Override  
  4.     public void onCreate(Bundle savedInstanceState) {  
  5.         super.onCreate(savedInstanceState);  
  6.         setContentView(R.layout.main);  
  7.         // 封裝資料  
  8.         Person p = new Person();  
  9.         p.setId(1);  
  10.         p.setName("xiaoming");  
  11.         // 用Intent傳遞Person對象  
  12.         Intent i = new Intent(this, TwoActivity.class);  
  13.         i.putExtra("Person", p);  
  14.         startActivity(i);  
  15.     }  
  16. }  
 2.TwoActivity擷取資料,從DemoActivity傳遞的Person對象給解析,並列印;
[java] view plaincopyprint?
  1. public class TwoActivity extends Activity {  
  2.   
  3.   
  4.     @Override  
  5.     protected void onCreate(Bundle savedInstanceState) {  
  6.         // TODO Auto-generated method stub  
  7.         super.onCreate(savedInstanceState);  
  8.           
  9.         Person p = (Person)getIntent().getParcelableExtra("Person");  
  10.           
  11.         System.out.println("p_id"+p.getId());  
  12.         System.out.println("p_name"+p.getName());  
  13.     }  
  14. }  

3.parcelable介面的實現

[java] view plaincopyprint?
  1. public class Person implements Parcelable{  
  2.       
  3.     // 成員變數  
  4.     private int id;  
  5.     private String name;  
  6.       
  7.     // 1.必須實現Parcelable.Creator介面,否則在擷取Person資料的時候,會報錯,如下:  
  8.     // android.os.BadParcelableException:  
  9.     // Parcelable protocol requires a Parcelable.Creator object called  CREATOR on class com.um.demo.Person  
  10.     // 2.這個介面實現了從Percel容器讀取Person資料,並返回Person對象給邏輯層使用  
  11.     // 3.實現Parcelable.Creator介面對象名必須為CREATOR,不如同樣會報錯上面所提到的錯;  
  12.     // 4.在讀取Parcel容器裡的資料事,必須按成員變數聲明的順序讀取資料,不然會出現擷取資料出錯  
  13.     // 5.還原序列化對象  
  14.     public static final Parcelable.Creator<Person> CREATOR = new Creator(){  
  15.   
  16.         @Override  
  17.         public Person createFromParcel(Parcel source) {  
  18.             // TODO Auto-generated method stub  
  19.             // 必須按成員變數聲明的順序讀取資料,不然會出現擷取資料出錯  
  20.             Person p = new Person();  
  21.             p.setId(source.readInt());  
  22.             p.setName(source.readString());  
  23.             return p;  
  24.         }  
  25.   
  26.         @Override  
  27.         public Person[] newArray(int size) {  
  28.             // TODO Auto-generated method stub  
  29.             return new Person[size];  
  30.         }  
  31.     };  
  32.       
  33.     public int getId() {  
  34.         return id;  
  35.     }  
  36.   
  37.     public void setId(int id) {  
  38.         this.id = id;  
  39.     }  
  40.   
  41.     public String getName() {  
  42.         return name;  
  43.     }  
  44.   
  45.     public void setName(String name) {  
  46.         this.name = name;  
  47.     }  
  48.   
  49.     @Override  
  50.     public int describeContents() {  
  51.         // TODO Auto-generated method stub  
  52.         return 0;  
  53.     }  
  54.   
  55.     @Override  
  56.     public void writeToParcel(Parcel dest, int flags) {  
  57.         // TODO Auto-generated method stub  
  58.         // 1.必須按成員變數聲明的順序封裝資料,不然會出現擷取資料出錯  
  59.         // 2.序列化對象  
  60.         dest.writeInt(id);  
  61.         dest.writeString(name);  
  62.     }  
  63. }  

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.