什么是Parcelable ,? Parcelable,定義了將數(shù)據(jù)寫入Parcel,,和從Parcel中讀出的接口。一個(gè)實(shí)體(用類來表示),,如果需要封裝到消息中去,,就必須實(shí)現(xiàn)這一接口,實(shí)現(xiàn)了這一接口,,該實(shí)體就成為“可打包的”了,。
Parcelable 傳遞對象 Android序列化對象主要有兩種方法: 1.實(shí)現(xiàn)Serializable接口,實(shí)現(xiàn)Serializable接口是JavaSE本身就支持的; 2.實(shí)現(xiàn)Parcelable接口,Parcelable是Android特有的功能,效率比實(shí)現(xiàn)Serializable接口高,,像用于Intent數(shù)據(jù)傳遞也都支持,,而且還可以用在進(jìn)程間通信(IPC), 除了基本類型外,,只有實(shí)現(xiàn)了Parcelable接口的類才能被放入Parcel中,。
Parcelable接口定義 public interface Parcelable { //內(nèi)容描述接口,基本不用管 public int describeContents(); //寫入接口函數(shù),,打包 public void writeToParcel(Parcel dest, int flags); //讀取接口,,目的是要從Parcel中構(gòu)造一個(gè)實(shí)現(xiàn)了Parcelable的類的實(shí)例處理。因?yàn)閷?shí)現(xiàn)類在這里還是不可知的,,所以需要用到模板的方式,繼承類名通過模板參數(shù)傳入,。 //為了能夠?qū)崿F(xiàn)模板參數(shù)的傳入,,這里定義Creator嵌入接口,內(nèi)含兩個(gè)接口函數(shù)分別返回單個(gè)和多個(gè)繼承類實(shí)例。 public interface Creator<T> { public T createFromParcel(Parcel source); public T[] newArray(int size); }
怎么實(shí)現(xiàn)Parcelable接口,? 從parcelable接口定義中,,我們可以看到,實(shí)現(xiàn)parcelable接口,,需要我們實(shí)現(xiàn)下面幾個(gè)方法: 1.describeContents方法,。內(nèi)容接口描述,,默認(rèn)返回0就可以; 2.writeToParcel 方法。該方法將類的數(shù)據(jù)寫入外部提供的Parcel中.即打包需要傳遞的數(shù)據(jù)到Parcel容器保存,,以便從parcel容器獲取數(shù)據(jù),,該方法聲明如下: writeToParcel (Parcel dest, int flags) 具體參數(shù)含義見javadoc 3.靜態(tài)的Parcelable.Creator接口,本接口有兩個(gè)方法: createFromParcel(Parcel in) 從Parcel容器中讀取傳遞數(shù)據(jù)值,,封裝成Parcelable對象返回邏輯層,。 newArray(int size) 創(chuàng)建一個(gè)類型為T,長度為size的數(shù)組,,僅一句話(return new T[size])即可,。方法是供外部類反序列化本類數(shù)組使用。
代碼實(shí)現(xiàn) 1.封裝數(shù)據(jù),,把實(shí)現(xiàn)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); // 封裝數(shù)據(jù) 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獲取數(shù)據(jù),,從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接口的實(shí)現(xiàn) 1 public class Person implements Parcelable{ 2 3 // 成員變量 4 private int id; 5 private String name; 6 7 // 1.必須實(shí)現(xiàn)Parcelable.Creator接口,否則在獲取Person數(shù)據(jù)的時(shí)候,會(huì)報(bào)錯(cuò),,如下: 8 // android.os.BadParcelableException: 9 // Parcelable protocol requires a Parcelable.Creator object called CREATOR on class com.um.demo.Person 10 // 2.這個(gè)接口實(shí)現(xiàn)了從Percel容器讀取Person數(shù)據(jù),,并返回Person對象給邏輯層使用 11 // 3.實(shí)現(xiàn)Parcelable.Creator接口對象名必須為CREATOR,不如同樣會(huì)報(bào)錯(cuò)上面所提到的錯(cuò),; 12 // 4.在讀取Parcel容器里的數(shù)據(jù)事,,必須按成員變量聲明的順序讀取數(shù)據(jù),不然會(huì)出現(xiàn)獲取數(shù)據(jù)出錯(cuò) 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 // 必須按成員變量聲明的順序讀取數(shù)據(jù),,不然會(huì)出現(xiàn)獲取數(shù)據(jù)出錯(cuò) 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.必須按成員變量聲明的順序封裝數(shù)據(jù),,不然會(huì)出現(xiàn)獲取數(shù)據(jù)出錯(cuò) 59 // 2.序列化對象 60 dest.writeInt(id); 61 dest.writeString(name); 62 } 63 }
好了,parcelable接口的實(shí)現(xiàn),,到處結(jié)束?。?/strong>
轉(zhuǎn)載請注明出處:http://www.cnblogs.com/hpboy |
|