TShopping

 找回密碼
 註冊
搜索
查看: 582|回復: 0

[教學] Android Parcelable接口的使用

[複製鏈接]
發表於 2014-12-9 23:32:30 | 顯示全部樓層 |閱讀模式
 
Push to Facebook Push to Plurk Push to Twitter 
什麼是Parcelable ?
     Parcelable,定義了將數據寫入Parcel,和從Parcel中讀出的接口。一個實體(用類來表示),如果需要封裝到消息中去,就必須實現這一接口,實現了這一接口,該實體就成為“可打包的”了。

Parcelable 傳遞對象
    Android序列化對象主要有兩種方法:
    1.實現Serializable接口,實現Serializable接口是JavaSE本身就支持的;
    2.實現Parcelable接口,Parcelable是Android特有的功能,效率比實現Serializable接口高,像用於Intent數據傳遞也都支持,而且還可以用在進程間通信(IPC),
      除了基本類型外,只有實現了Parcelable接口的類才能被放入Parcel中。

Parcelable接口定義
  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裡;
  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對像給解析,並打印;
  1. public  class TwoActivity extends Activity {

  2.     @Override
  3.     protected  void onCreate(Bundle savedInstanceState) {
  4.          // TODO Auto-generated method stub
  5.         super .onCreate(savedInstanceState);
  6.         
  7.         Person p = (Person)getIntent().getParcelableExtra("Person" );
  8.         
  9.         System.out.println( "p_id"+ p.getId());
  10.         System.out.println( "p_name"+ p.getName());
  11.     }
  12. }
複製代碼

3.parcelable接口的實現
  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.          @Override
  16.          public Person createFromParcel(Parcel source) {
  17.              // TODO Auto-generated method stub
  18.              // 必須按成員變量聲明的順序讀取數據,不然會出現獲取數據出錯
  19.              Person p = new Person();
  20.              p.setId(source.readInt( ));
  21.              p.setName(source.readString());
  22.              return p;
  23.          }

  24.          @Override
  25.          public Person[] newArray( int size) {
  26.              // TODO Auto-generated method stub
  27.              return  new Person[ size];
  28.          }
  29.      };
  30.      
  31.      public  int getId() {
  32.          return id;
  33.      }

  34.      public  void setId( int id) {
  35.          this .id = id;
  36.      }

  37.      public String getName() {
  38.          return name;
  39.      }

  40.      public  void setName(String name) {
  41.          this .name = name;
  42.      }

  43.      @Override
  44.      public  int describeContents() {
  45.          // TODO Auto-generated method stub
  46.          return 0 ;
  47.      }

  48.      @Override
  49.      public  void writeToParcel(Parcel dest, int flags) {
  50.          // TODO Auto-generated method stub
  51.          // 1.必須按成員變量聲明的順序封裝數據,不然會出現獲取數據出錯
  52.          // 2 .序列化對象
  53.          dest.writeInt(id);
  54.          dest.writeString(name);
  55.      }
  56. }
複製代碼

好了,parcelable接口的實現,到處結束!!


 

臉書網友討論
您需要登錄後才可以回帖 登錄 | 註冊 |

本版積分規則



Archiver|手機版|小黑屋|免責聲明|TShopping

GMT+8, 2016-12-8 08:30 , Processed in 0.063015 second(s), 22 queries .

本論壇言論純屬發表者個人意見,與 TShopping綜合論壇 立場無關 如有意見侵犯了您的權益 請寫信聯絡我們。

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表