安卓學習之--android 數據傳遞詳解(Serialization、Parcelable、Parcel、Intent、Bundle)


本文來自網絡。。。供大家參考
 
第一、四大組件間數據傳遞方式:
啟動四大組件通過Intent對象來實現,Intent的功能包括啟動四大組件以及相關信息+傳遞數據。
其中傳遞數據Intent提供了putExtra和對應的getExtra方法來實現:
putExtra和getExtra 其實是和Bundle put和get方法一一對應的,在Intent類中有一個Bundle的mExtras成員變量
所有的putExtra和getExtra方式實際是調用mExtras對象的put和get方法進行存取。
所以正常情況下 四大組件間傳遞數據直接通過putExtra和getExtra方法存取即可,無需再創建一個bundle對象。
Intent  putExtra方法:
Intent  putExtra(String name, Bundle value)
Intent  putExtra(String name, Parcelable[] value)
Intent  putExtra(String name, Serializable value)
Intent  putExtra(String name, Parcelable value)
Intent  putExtra(String name, int[] value)
Intent  putExtra(String name, float value)
Intent  putExtra(String name, byte[] value)
Intent  putExtra(String name, long[] value)
Intent  putExtra(String name, float[] value)
Intent  putExtra(String name, long value)
Intent  putExtra(String name, String[] value)
Intent  putExtra(String name, boolean value)
Intent  putExtra(String name, boolean[] value)
Intent  putExtra(String name, short value)
Intent  putExtra(String name, double value)
Intent  putExtra(String name, short[] value)
Intent  putExtra(String name, String value)
Intent  putExtra(String name, byte value)
Intent  putExtra(String name, char[] value)
Intent  putExtra(String name, CharSequence[] value)
Intent  putExtras(Intent src)
Intent  putExtras(Bundle extras)
Intent  putIntegerArrayListExtra(String name, ArrayList<Integer> value)
Intent  putParcelableArrayListExtra(String name, ArrayList<? extends Parcelable> value)
Intent  putStringArrayListExtra(String name, ArrayList<String> value)
 
Intent getExtra方法:
double[]  getDoubleArrayExtra(String name)
double  getDoubleExtra(String name, double defaultValue)
Bundle  getExtras()
int  getFlags()
float[]  getFloatArrayExtra(String name)
float  getFloatExtra(String name, float defaultValue)
int[]  getIntArrayExtra(String name)
int  getIntExtra(String name, int defaultValue)
ArrayList<Integer>  getIntegerArrayListExtra(String name)
long[]  getLongArrayExtra(String name)
long  getLongExtra(String name, long defaultValue)
Parcelable[]  getParcelableArrayExtra(String name)
<T extends Parcelable> ArrayList<T>  getParcelableArrayListExtra(String name)
<T extends Parcelable> T  getParcelableExtra(String name)
Serializable  getSerializableExtra(String name)
short[]  getShortArrayExtra(String name)
short  getShortExtra(String name, short defaultValue)
String[]  getStringArrayExtra(String name)
ArrayList<String>  getStringArrayListExtra(String name)
String  getStringExtra(String name)
 
Intent 的mExtras對象:
    private Bundle mExtras;
 
    public Intent putExtra(String name, Parcelable value) {
        if (mExtras == null) {
            mExtras = new Bundle();
        }
        mExtras.putParcelable(name, value);
        return this;
    }
 
 
第二、自定義對象的傳遞:
通過intent 傳遞自定義對象的方法有兩個,第一是實現Serialization接口,第二是實現Parcelable接口。
首選推薦Parceable,android中的很多數據類型都是實現Serialable接口方式來傳遞的,例如 Intent、Bundle、Bitmap、Uri等等。
android Parcelable化的提供了一個接口 Parcelable和一個工具類 Parcel
Parcelable:一個規范接口,定義實現Parcelable需要實現的功能
Parcel:數據存取的工具類,供用戶在實現Parcelable接口時存取自定義數據用,也供系統傳遞數據時使用。
 
Parcelable實現要點:需要實現三個東西
1)writeToParcel 方法。該方法將類的數據寫入外部提供的Parcel中.聲明如下:
writeToParcel (Parcel dest, int flags) 具體參數含義見javadoc
2)describeContents方法。沒搞懂有什么用,反正直接返回0也可以
3)靜態的Parcelable.Creator接口,本接口有兩個方法:
createFromParcel(Parcel in) 實現從in中創建出類的實例的功能
newArray(int size) 創建一個類型為T,長度為size的數組,僅一句話(return new T[size])即可。估計本方法是供外部類反序列化本類數組使用。
android doc示例代碼:
 publicclassMyParcelableimplementsParcelable{
     privateint mData;

     publicint describeContents(){
         return0;
     }

     publicvoid writeToParcel(Parcelout,int flags){
         out.writeInt(mData);
     }

     publicstaticfinalParcelable.Creator<MyParcelable> CREATOR
             =newParcelable.Creator<MyParcelable>(){
         publicMyParcelable createFromParcel(Parcelin){
             returnnewMyParcelable(in);
         }

         publicMyParcelable[] newArray(int size){
             returnnewMyParcelable[size];
         }
     };
     
     privateMyParcelable(Parcelin){
         mData =in.readInt();
     }
 }
 
android 中 自定義的對象序列化的問題 有兩個選擇一個是Parcelable,另外一個是Serializable。

一 序列化原因:

1.永久性保存對象,保存對象的字節序列到本地文件中;
2.通過序列化對象在網絡中傳遞對象;
3.通過序列化在進程間傳遞對象。 

二 至於選取哪種可參考下面的原則:

1.在使用內存的時候,Parcelable 類比Serializable性能高,所以推薦使用Parcelable類。
2.Serializable在序列化的時候會產生大量的臨時變量,從而引起頻繁的GC。
3.Parcelable不能使用在要將數據存儲在磁盤上的情況,因為Parcelable不能很好的保證數據的持續性在外界有變化的情況下。盡管Serializable效率低點, 也不提倡用,但在這種情況下,還是建議你用Serializable 。


實現:
1 Serializable 的實現,只需要繼承  implements Serializable 即可。這只是給對象打了一個標記,系統會自動將其序列化。

2 Parcelabel 的實現,需要在類中添加一個靜態成員變量 CREATOR,這個變量需要繼承 Parcelable.Creator 接口。
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM