Intent传递对象
传递单个对象:
序列化:就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。
将一个类对象转换成可存储、可传输状态的过程
对象需要序列化,有两种序列化方式,java的和安卓的
java方式:Serializable
public class Student implements Serializable {
Student student = new Student();
student.setId(10010);
student.setName("传音");
student.setSchool("哈哈哈");
intent.putExtra("stu",student);
Student student = (Student) intent.getSerializableExtra("stu");
Log.d("xssssddd",student.toString()+"");
安卓的序列化:Parcelable
P是Android SDK API,其序列化操作完全由底层实现,可以在进程内、进程间(AIDL)高效传输数据。不同版本的API实现方式可能不同,不宜做本地持久化存储。
class PeopleS implements Parcelable
public class PeopleS implements Parcelable {
private int id;
private String name;
protected PeopleS(Parcel in) {
id = in.readInt();
name = in.readString();
}
public PeopleS( String name, int id) {
this.name = name;
this.id = id;
}
public PeopleS(){
}
/**
* 反序列化
*/
public static final Creator<PeopleS> CREATOR = new Creator<PeopleS>() {
/**
* 从序列化对象中创建原始对象
*/
@Override
public PeopleS createFromParcel(Parcel in) {
return new PeopleS(in);
}
/**
* 创建指定长度的原始对象数组
*/
@Override
public PeopleS[] newArray(int size) {
return new PeopleS[size];
}
};
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "PeopleS{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
/**
* 当前对象的内容描述,存在文件描述符时返回1 其余全返回0
*/
@Override
public int describeContents() {
return 0;
}
/**
* 序列化:将当前对象写入序列化结构中
*/
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeInt(id);
parcel.writeString(name);
}
}
2、效率及选择
Serializable是Java中的序列化接口,其使用起来简单但开销较大(因为Serializable在序列化过程中使 用了反射机制,故而会产生大量的临时变量,从而导致频繁的GC),并且在读写数据过程中,它是通 过IO流的形式将数据写入到硬盘或者传输到网络上。Parcelable的性能比Serializable好,在内存开销方面较小,所以在内存间数据传输时推荐使用Parcelable,如activity间传输数据。而Serializable可将数据持久化方便保存,Parcelable不能很好的保证数据的持续性,使用相对复杂,所以在需要保存或网络传输数据时选择Serializable。
Serializable使用了反射技术,并且期间产生临时对象
Parcelable的性能比Serializable好,在内存开销方面较小,所以在内存间数据传输时推荐使用Parcelable,如activity间传输数据,而Serializable可将数据持久化方便保存,所以在需要保存或网络传输数据时选择Serializable,因为android不同版本Parcelable可能不同,所以不推荐使用Parcelable进行数据持久化
一组对象传输:
Serializable
for(int i = 0; i < 5; i++){
Student student1 = new Student();
student1.setId(i);
student1.setName("xxx"+i);
student1.setSchool("ooo"+i);
students.add(student1);
}
intent.putExtra("students",(Serializable) students);
List<Student> students = (List<Student>) intent.getSerializableExtra("students");
Log.d("xssssddd",students.toString());
Parcelable
List<PeopleS> peopleSs = new ArrayList<>();
for(int i = 0; i < 5; i++){
PeopleS peopleS1 = new PeopleS();
peopleS1.setName("psssssssd"+i);
peopleS1.setId(i);
peopleSs.add(peopleS1);
}
intent.putParcelableArrayListExtra("peopleSs", (ArrayList<? extends Parcelable>) peopleSs);
List<PeopleS> peopleSs = (List<PeopleS>) intent.getSerializableExtra("peopleSs");
Log.d("xssssddd",peopleSs.toString());