Android--Intent传递对象
Intent 传递对象通常有两种实现方式,Serializable 和 Parcelable;
一、Serializable:序列化,表示将一个对象转换成可存储或可传输的状态,序列化后的对象可以在网络上进行传输,也可以存储到本地。这里实现了 Serializable 接口的类就可以通过 Intent 传递了;
--发起方传递对象:调用 Intent 的 putExtra() 即可;
1 Person person = new Person(); 2 person.setName("Tom"); 3 person.setAge(20); 4 Intent intent = new Intent(FirstActivity.this, SecondActivity.class); 5 intent.putExtra("person_data", person); 6 startActivity(intent);
--接收对象:需要调用 Intent 的 getSerializableExtra() 方法来获取实现了序列化的对象;
1 Person person = (Person) getIntent().getSerializableExtra("person_data");
二、Parcelable:Parcelable 方式的实现原理是将一个完整的对象进行分解,而分解后的每一部分都是Intent 所支持的数据类型:
--需要传递的对象在实现了 Parcelable 接口之后,需要重写如下方法并添加静态变量:
1)describeContents():一般返回 0 就可以;
2)writeToParcel(): 需要调用 Parcel 的writeXxx() 方法将类中的字段一一写出,如 writeInt()、writeString()等;
3)CREATOR:创建的一个 Parcelable.Creator<T> 接口的实现,其内部需要重写 createFromParcel() 和 newArray() 方法;在createFromParcel()方法中需要去读取刚刚写入的字段,然后创建对应的对象并返回,读取的方法为 readXxx(),读取的顺序一定要和刚才写出的顺序完全相同; newArray()方法只需要new 出一个对象数组并返回;
--例:
1 public class Person implements Parcelable { 2 private String name; 3 private int age; 4 …… 5 @Override 6 public int describeContents() { 7 return 0; 8 } 9 @Override 10 public void writeToParcel(Parcel dest, int flags) { 11 dest.writeString(name); // 写出name 12 dest.writeInt(age); // 写出age 13 } 14 public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>() { 15 @Override 16 public Person createFromParcel(Parcel source) { 17 Person person = new Person(); 18 person.name = source.readString(); // 读取name 19 person.age = source.readInt(); // 读取age 20 return person; 21 } 22 @Override 23 public Person[] newArray(int size) { 24 return new Person[size]; 25 } 26 }; 27 }
--Intent 中传递的方法与 Serializable 方式一样;
--接收对象则通过 Intent 的 getParcelableExtra() 来获取;
1 Person person = (Person) getIntent().getParcelableExtra("person_data");