歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android開發:什麼是Parcel(2)

Android開發:什麼是Parcel(2)

日期:2017/3/1 10:34:14   编辑:Linux編程

上回書解釋了IBinder(見 http://www.linuxidc.com/Linux/2012-02/53482.htm ),這回詳細解釋一下Parcel,以下是對Android sdk 文檔的翻議:
Parcel是一個容器,它主要用於存儲序列化數據,然後可以通過Binder在進程間傳遞這些數據(要了解為什麼要序列化,請參考:http://www.linuxidc.com/Linux/2012-02/53483.htm)。Parcel可以包含原始數據類型(用各種對應的方法寫入,比如writeInt(),writeFloat()等),可以包含Parcelable對象,它還包含了一個活動的IBinder對象的引用,這個引用導致另一端接收到一個指向這個IBinder的代理IBinder。

注:Parcel不是一般目的的序列化機制。這個類被設計用於高性能的IPC傳輸。因此不適合把Parcel寫入永久化存儲中,因為Parcel中的數據類型的實現的改變會導致舊版的數據不可讀。

Parcel的一坨一坨的API用於解決不同類型數據的讀寫。這些函數們主要有六種類型。

1原始類

這類方法們主要讀寫原始數據類型。它們是:writeByte(byte), readByte(), writeDouble(double), readDouble(), writeFloat(float), readFloat(), writeInt(int), readInt(), writeLong(long), readLong(), writeString(String), readString(). 大多數其它數據的操作都是基於這些方法。

2原始數組類

這類方法用於讀寫原始數據組成的數組。在向數組寫數據時先寫入數組的長度再寫入數據。讀數組的方法可以將數據讀到已存在的數組中,也可以創建並返回一個新數組。它們是:

  • writeBooleanArray(boolean[]), readBooleanArray(boolean[]), createBooleanArray()
    writeByteArray(byte[]), writeByteArray(byte[], int, int), readByteArray(byte[]), createByteArray()
    writeCharArray(char[]), readCharArray(char[]), createCharArray()
    writeDoubleArray(double[]), readDoubleArray(double[]), createDoubleArray()
    writeFloatArray(float[]), readFloatArray(float[]), createFloatArray()
    writeIntArray(int[]), readIntArray(int[]), createIntArray()
    writeLongArray(long[]), readLongArray(long[]), createLongArray()
    writeStringArray(String[]), readStringArray(String[]), createStringArray().
    writeSparseBooleanArray(SparseBooleanArray), readSparseBooleanArray().

3 Parcelable類
Parcelable為對象從Parcel中讀寫自己提供了極其高效的協議。你可以使用直接的方法 writeParcelable(Parcelable, int) 和 readParcelable(ClassLoader) 或 writeParcelableArray(T[], int) and readParcelableArray(ClassLoader) 進行讀寫。這些方法們把類的信息和數據都寫入Parcel,以使將來能使用合適的類裝載器重新構造類的實例。

還有一些方法提供了更高效的操作Parcelable們的途徑,它們是:writeTypedArray(T[], int), writeTypedList(List), readTypedArray(T[], Parcelable.Creator) and readTypedList(List, Parcelable.Creator)。這些方法不會寫入類的信息,取而代之的是:讀取時必須能知道數據屬於哪個類並傳入正確的Parcelable.Creator來創建對象而不是直接構造新對象。(更加高效的讀寫單個Parcelable對象的方法是:直接調用Parcelable.writeToParcel()和Parcelable.Creator.createFromParcel())

4 Bundles類

Bundles是一種類型安全的Map型容器,可用於存儲任何不同類型的數據。它具有很多對讀寫數據的性能優化,並且它的類型安全機制避免了當把它的數據封送到Parcel中時由於類型錯誤引起的BUG的調試的麻煩,可以使用的方法為: writeBundle(Bundle), readBundle(), and readBundle(ClassLoader)。

5 活動對象類

Parcel的一個非同尋常的特性是讀寫活對象的能力。對於活動對象,它們的內容實際上並沒有寫入,而是僅寫入了一個令牌來引用這個對象。當從Parcel中讀取這個對象時,你不會獲取一個新的對象實例,而是直接得到那個寫入的對象。有兩種活動對象可操作:

Binder對象。它是Android跨進程通訊的基礎。這種對象可被寫入Parcel,並在讀取時你將得到原始的對象或一個代理對象(可以想象:在進程內時得到原始的對象,在進程間時得到代理對象)。可以使用的方法們是: writeStrongBinder(IBinder), writeStrongInterface(IInterface), readStrongBinder(), writeBinderArray(IBinder[]), readBinderArray(IBinder[]), createBinderArray(), writeBinderList(List), readBinderList(List), createBinderArrayList()。

FileDescriptor對象。它代表了原始的Linux文件描述符,它可以被寫入Parcel並在讀取時返回一個ParcelFileDescriptor對象用於操作原始的文件描述符。ParcelFileDescriptor是原始描述符的一個復制:對象和fd不同,但是都操作於同一文件流,使用同一個文件位置指針,等等。可以使用的方法是:writeFileDescriptor(FileDescriptor), readFileDescriptor()。

6無類型容器類

一類final方法,用於讀寫標准的java容器類。這些方法們是:writeArray(Object[]), readArray(ClassLoader), writeList(List), readList(List, ClassLoader), readArrayList(ClassLoader), writeMap(Map), readMap(Map, ClassLoader), writeSparseArray(SparseArray), readSparseArray(ClassLoader)。

Copyright © Linux教程網 All Rights Reserved