Parcelable接口詳細介紹

什麼是Parcelable ? java

     Parcelable,定義了將數據寫入Parcel,和從Parcel中讀出的接口。一個實體(用類來表示),若是須要封裝到消息中去,就必須實現這一接口,實現了這一接口,該實體就成爲「可打包的」了。 android

 

Parcelable 傳遞對象 數組

    Android序列化對象主要有兩種方法: ide

    1.實現Serializable接口,實現Serializable接口是JavaSE自己就支持的; 函數

    2.實現Parcelable接口,Parcelable是Android特有的功能,效率比實現Serializable接口高,像用於Intent數據傳遞也都支持,並且還能夠用在進程間通訊(IPC), ui

      除了基本類型外,只有實現了Parcelable接口的類才能被放入Parcel中。 this

 

Parcelable接口定義 spa

複製代碼
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接口? .net

   從parcelable接口定義中,咱們能夠看到,實現parcelable接口,須要咱們實現下面幾個方法: code

   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裏;

複製代碼
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對象給解析,並打印;

   

複製代碼
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接口的實現

複製代碼
 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 }
相關文章
相關標籤/搜索