被傳遞的對象須要先實現序列化,而序列化對象有兩種方式:java.io.Serializable和android.os.Parcelable
Java中使用的是Serializable,而谷歌在Android使用了自定義的Parcelable。
兩種序列化方式的區別:
1.在使用內存的時候,Parcelable比Serializable性能高,推薦使用Parcelable類;
2.Serializable在序列化的時候會產生大量的臨時變量,從而引發頻繁的GC;
3.Parcelable不能使用在要將數據存儲在磁盤上的狀況,由於Parcelable不能很好的保證數據的持續性在外界有變化的狀況下,這種狀況建議使用Serializable。
第一步:定義序列化實體類;
java
Serializable方式:android
[java] view plaincopy數組
1. /** app
2. * PersonSer ide
3. * 性能
4. * @author http://blog.csdn.net/zuolongsnail this
5. */ spa
6. public class PersonSer implements Serializable { .net
7. orm
8. /**
9. * serialVersionUID的做用是在修改實體類後,能夠正常的序列化和反序列化,在此很少說,你們能夠谷歌百度下。
10. */
11. private static final long serialVersionUID = -7620435178023928252L;
12.
13. private String name;
14.
15. private int age;
16.
17. public String getName() {
18. return name;
19. }
20.
21. public void setName(String name) {
22. this.name = name;
23. }
24.
25. public int getAge() {
26. return age;
27. }
28.
29. public void setAge(int age) {
30. this.age = age;
31. }
32.
33. }
Parcelable方式:
[java] view plaincopy
1. /**
2. * PersonPar
3. *
4. * @author http://blog.csdn.net/zuolongsnail
5. */
6. public class PersonPar implements Parcelable {
7.
8. private String name;
9.
10. private int age;
11.
12. public String getName() {
13. return name;
14. }
15.
16. public void setName(String name) {
17. this.name = name;
18. }
19.
20. public int getAge() {
21. return age;
22. }
23.
24. public void setAge(int age) {
25. this.age = age;
26. }
27.
28. /**
29. * 序列化實體類
30. */
31. public static final Parcelable.Creator<PersonPar> CREATOR = new Creator<PersonPar>() {
32. public PersonPar createFromParcel(Parcel source) {
33. PersonPar personPar = new PersonPar();
34. personPar.name = source.readString();
35. personPar.age = source.readInt();
36. return personPar;
37. }
38.
39. public PersonPar[] newArray(int size) {
40. return new PersonPar[size];
41. }
42. };
43.
44. @Override
45. public int describeContents() {
46. return 0;
47. }
48.
49. /**
50. * 將實體類數據寫入Parcel
51. */
52. @Override
53. public void writeToParcel(Parcel parcel, int flags) {
54. parcel.writeString(name);
55. parcel.writeInt(age);
56. }
57.
58. }
第二步:傳遞序列化對象;
[java] view plaincopy
1. Intent intent = new Intent(MainActivity.this, DestActivity.class);
2. Bundle bundle = new Bundle();
3. switch (v.getId()) {
4. case R.id.serializable_btn:
5. // Serializable傳遞對象
6. PersonSer personSer = new PersonSer();
7. personSer.setName("zuolong");
8. personSer.setAge(26);
9. bundle.putSerializable(SER_KEY, personSer);
10. intent.putExtra("type", SER_TYPE);
11. intent.putExtras(bundle);
12. startActivity(intent);
13. break;
14. case R.id.parcelable_btn:
15. // Parcelable傳遞對象
16. PersonPar personPar = new PersonPar();
17. personPar.setName("snail");
18. personPar.setAge(27);
19. // Bundle有putParcelableArray和putParcelableArrayList方法,也就能夠傳遞數組和列表
20. bundle.putParcelable(PAR_KEY, personPar);
21. intent.putExtra("type", PAR_TYPE);
22. // Intent也有putParcelableArrayListExtra方法,能夠傳遞實現Parcelable接口的對象列表
23. intent.putExtras(bundle);
24. startActivity(intent);
25. break;
26. }
第三步:獲取對象;
[java] view plaincopy
1. StringBuffer sb = new StringBuffer();
2. String type = getIntent().getStringExtra("type");
3. // 根據type判斷是哪一種類型
4. if (type.equals(MainActivity.SER_TYPE)) {
5. // 獲取Serializable對象
6. PersonSer personSer = (PersonSer) getIntent().getSerializableExtra(
7. MainActivity.SER_KEY);
8. sb.append("----From Serializable----").append("\n");
9. sb.append("Name:").append(personSer.getName()).append("\n");
10. sb.append("Age:").append(personSer.getAge()).append("\n");
11. } else if (type.equals(MainActivity.PAR_TYPE)) {
12. // 獲取Parcelable對象
13. PersonPar personPar = (PersonPar) getIntent().getParcelableExtra(
14. MainActivity.PAR_KEY);
15. sb.append("----From Parcelable----").append("\n");
16. sb.append("Name:").append(personPar.getName()).append("\n");
17. sb.append("Age:").append(personPar.getAge()).append("\n");
18. }