編輯:關於Android編程
什麼是Parcelable ?
Parcelable,定義了將數據寫入Parcel,和從Parcel中讀出的接口。一個實體(用類來表示),如果需要封裝到消息中去,就必須實現這一接口,實現了這一接口,該實體就成為“可打包的”了。
Parcelable 傳遞對象
Android序列化對象主要有兩種方法:
1.實現Serializable接口,實現Serializable接口是JavaSE本身就支持的;
2.實現Parcelable接口,Parcelable是Android特有的功能,效率比實現Serializable接口高,像用於Intent數據傳遞也都支持,而且還可以用在進程間通信(IPC),
除了基本類型外,只有實現了Parcelable接口的類才能被放入Parcel中。
Parcelable接口定義
public interface Parcelable { //內容描述接口,基本不用管 public int describeContents(); //寫入接口函數,打包 public void writeToParcel(Parcel dest, int flags); //讀取接口,目的是要從Parcel中構造一個實現了Parcelable的類的實例處理。因為實現類在這裡還是不可知的,所以需要用到模板的方式,繼承類名通過模板參數傳入。 //為了能夠實現模板參數的傳入,這裡定義Creator嵌入接口,內含兩個接口函數分別返回單個和多個繼承類實例。 public interface Creator{ 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[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()); } }
public class Person implements Parcelable{ // 成員變量 private int 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.反序列化對象 public static final Parcelable.CreatorCREATOR = 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 return new Person[size]; } }; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public int describeContents() { // TODO Auto-generated method stub return 0; } @Override public void writeToParcel(Parcel dest, int flags) { // TODO Auto-generated method stub // 1.必須按成員變量聲明的順序封裝數據,不然會出現獲取數據出錯 // 2.序列化對象 dest.writeInt(id); dest.writeString(name); } }
動態加載資源原理通常我們調用getResources()方法獲取資源文件public Resources getResources() { return mReso
緒論:好久沒寫博客了,最近比較懶,不想寫博客,但是在看書,看一些Android進階的書,這裡小編也給大家推薦幾本適合進階的書,相信會對你有所幫助的。1.《Android群
最近本人需要用到夜間模式,但是經過一番搜索似乎並沒有看到好的開源實現,看到有一個類似的庫MultipleTheme,但是需要自定義所有要實現換膚功能的View,感覺比較麻
最近的項目,有個需求需要使用條狀圖顯示比例,並且右對齊,見下圖: 我想到了使用進度條,這樣不就不需要在代碼動態繪制條狀了,省了很多活。 那麼進度條怎樣從右向左顯示呢?