parcel定義介紹:
android提供了一種新的類型:parcel(英文解釋:包裹,小包),本類用來封裝數據的容器,封裝後的數據可以通過Intent或IPC傳遞,除了基本類型外,只有實現了Parcelable接口的類才能放入parcel中。
parcel一般都用在Binder通信,通過read和write方法進行客戶端與服務端的數據傳遞(通信)。
比如:frameworks層服務端與hardware客戶端的Binder通信
reply->writeInt32(getCardReaderSize());
int
mid = data.readInt32();
用來存放parcel數據的是內存(RAM),而不是永遠介質(Nand等)。
parcelable定義了把數據寫入parcel和從parcel讀出數據的接口,一個類的實例,如果需要封裝到消息中去,就必須實現這一接口,如果實現了這個接口,該類的實例就是可以“被打包”。
Parcelable的定義:
下面我們看下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);
}
還有一個子接口繼承Creator,子接口只提供了一個函數,返回單個繼承類實例
public interface ClassLoaderCreator<T> extends Creator<T>
Parcelable的實現使用:
Parcelabel
的實現,需要在類中添加一個靜態成員變量 CREATOR,這個變量需要繼承 Parcelable.Creator 接口。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
package
com.zlc.provider; import
android.os.Parcel; import
android.os.Parcelable; public
class
Students implements
Parcelable{ private
int
stu_id; private
String stu_name; public
Students(Parcel source){ stu_id
= source.readInt(); stu_name
= source.readString(); } public
int
getStu_id() { return
stu_id; } public
void
setStu_id( int
stu_id) { this .stu_id
= stu_id; } public
String getStu_name() { return
stu_name; } public
void
setStu_name(String stu_name) { this .stu_name
= stu_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 dest.writeInt(stu_id); dest.writeString(stu_name); } //Interface
that must be implemented and provided as a public CREATOR field that generates instances of your Parcelable class from a Parcel.
public
final
static
Parcelable.Creator<Students> CREATOR = new
Parcelable.Creator<Students>() { @Override public
Students createFromParcel(Parcel source) { //
TODO Auto-generated method stub return
new
Students(source); } @Override public
Students[] newArray( int
size) { //
TODO Auto-generated method stub return
new
Students[size]; } }; } |
Parcelable和Serializable的區別:
android自定義對象可序列化有兩個選擇一個是Serializable和Parcelable
一、對象爲什麼需要序列化
1.永久性保存對象,保存對象的字節序列到本地文件。
2.通過序列化對象在網絡中傳遞對象。
3.通過序列化對象在進程間傳遞對象。
二、當對象需要被序列化時如何選擇所使用的接口
1.在使用內存的時候Parcelable比Serializable的性能高。
2.Serializable在序列化的時候會產生大量的臨時變量,從而引起頻繁的GC(內存回收)。
3.Parcelable不能使用在將對象存儲在磁盤上這種情況,因爲在外界的變化下Parcelable不能很好的保證數據的持續性。