在android提供了一種類型:Parcel。被用作封裝數(shù)據(jù)的容器,封裝后的數(shù)據(jù)可以通過Intent或IPC傳遞。 除了基本類型以外,只有實(shí)現(xiàn)了Parcelable接口的類才能被放入Parcel中。
Parcelable實(shí)現(xiàn)要點(diǎn):需要實(shí)現(xiàn)三個(gè)東西
1)writeToParcel 方法。該方法將類的數(shù)據(jù)寫入外部提供的Parcel中.聲明如下:
writeToParcel (Parcel dest, int flags) 具體參數(shù)含義見javadoc
2)describeContents方法。沒搞懂有什么用,反正直接返回0也可以
3)靜態(tài)的Parcelable.Creator接口。本接口有兩個(gè)方法:
createFromParcel(Parcel in) 實(shí)現(xiàn)從in中創(chuàng)建出類的實(shí)例的功能
newArray(int size) 創(chuàng)建一個(gè)類型為T,長(zhǎng)度為size的數(shù)組,僅一句話(return new T[size])即可。估計(jì)本方法是供外部類反序列化本類數(shù)組使用。
測(cè)試用的接收信息Activity:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.os.Parcelable; public class Test extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.main); Intent i = getIntent(); Person p = i.getParcelableExtra( "yes" ); System.out.println( "---->" +p.name); System.out.println( "---->" +p.map.size()); } } |
發(fā)送的Activity:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
import java.util.HashMap; import android.app.Activity; import android.content.Intent; import android.os.Bundle; public class TestNew extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.main); Intent intent = new Intent(); Person p = new Person(); p.map = new HashMap<String,String>(); p.map.put( "yes" , "ido" ); p.name= "ok" ; intent.putExtra( "yes" , p); intent.setClass( this , Test. class ); startActivity(intent); } } |
Parcelable的實(shí)現(xiàn)類:
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
|
import java.util.HashMap; import android.os.Parcel; import android.os.Parcelable; public class Person implements Parcelable { public HashMap<String,String> map = new HashMap<String,String> (); public String name ; @Override public int describeContents() { return 0 ; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeMap(map); dest.writeString(name); } public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>() { //重寫Creator @Override public Person createFromParcel(Parcel source) { Person p = new Person(); p.map=source.readHashMap(HashMap. class .getClassLoader()); p.name=source.readString(); return p; } @Override public Person[] newArray( int size) { // TODO Auto-generated method stub return null ; } }; } |