woff 發表於 2014-12-9 23:32:30

Android Parcelable接口的使用

什麼是Parcelable ?   Parcelable,定義了將數據寫入Parcel,和從Parcel中讀出的接口。一個實體(用類來表示),如果需要封裝到消息中去,就必須實現這一接口,實現了這一接口,該實體就成為“可打包的”了。
Parcelable 傳遞對象    Android序列化對象主要有兩種方法:    1.實現Serializable接口,實現Serializable接口是JavaSE本身就支持的;    2.實現Parcelable接口,Parcelable是Android特有的功能,效率比實現Serializable接口高,像用於Intent數據傳遞也都支持,而且還可以用在進程間通信(IPC),      除了基本類型外,只有實現了Parcelable接口的類才能被放入Parcel中。
Parcelable接口定義publicinterface Parcelable {
   // 內容描述接口,基本不用管
    publicint describeContents();
   // 寫入接口函數,打包
    publicvoid writeToParcel(Parcel dest, int flags);
      // 讀取接口,目的是要從Parcel中構造一個實現了Parcelable的類的實例處理。因為實現類在這裡還是不可知的,所以需要用到模板的方式,繼承類名通過模板參數傳入。
    // 為了能夠實現模板參數的傳入,這裡定義Creator嵌入接口,內含兩個接口函數分別返回單個和多個繼承類實例。
    publicinterface 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)即可。方法是供外部類反序列化本類數組使用。
代碼實現1.封裝數據,把實現parcelable接口的Person對像傳遞到TwoActivity裡;publicclass DemoActivity extends Activity {
   /** Called when the activity is first created. */
    @Override
    publicvoid 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對像給解析,並打印;publicclass TwoActivity extends Activity {

    @Override
    protectedvoid 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接口的實現publicclass Person implements Parcelable{
   
   // 成員變量
   privateint 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.反序列化對象
   publicstaticfinal 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
             returnnew Person[ size];
         }
   };
   
   publicint getId() {
         return id;
   }

   publicvoid setId( int id) {
         this .id = id;
   }

   public String getName() {
         return name;
   }

   publicvoid setName(String name) {
         this .name = name;
   }

   @Override
   publicint describeContents() {
         // TODO Auto-generated method stub
         return 0 ;
   }

   @Override
   publicvoid writeToParcel(Parcel dest, int flags) {
         // TODO Auto-generated method stub
         // 1.必須按成員變量聲明的順序封裝數據,不然會出現獲取數據出錯
         // 2 .序列化對象
         dest.writeInt(id);
         dest.writeString(name);
   }
}
好了,parcelable接口的實現,到處結束!!轉載:http://www.cnblogs.com/hpboy
頁: [1]
查看完整版本: Android Parcelable接口的使用