本篇主要内容:使用Intent在activity之间传递对象的两种实现方式.Serializable和Parcalable.
1.Serializable
Serializable就是序列化的意思,表示将一个对象转换成科存储化或可传输的状态,序列化后的对象可以保存在网络也可以保存在本地,下面简单介绍使用.比如有Person类.
public class Person implements Serializable{ private String name ; private int age; public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public int getAge() { return age; } }
上面代码很简单,定义一个Person类,实现Serializable接口.这样的话,Person对象就是可序列化的了.
下面简单说明一下,如何使用,如下:A activity直接调用,
Person person =new Person(); person.setAge(20); person.setName("nanyin"); Intent intent =new Intent(this,SecondActivity.class); intent.putExtra("person_data",person); startActivity(intent);可以看到,我们创建了一个Person实例,直接将它传入到putExtra方法中了,因为Person类已经实现了Serializable接口,所以可以这样传递。然后在B activity获取:Person person = (Person) getIntent().getSerializableExtra("person_data");
这里通过调用getSerializableExtra方法获取通过参数传递过来的序列化对象,再讲它乡下转型成Person对象,就可以实现了使用intent来传递对象的功能了。(源码在文章底部)2.Parcalable
Parcalable实现原理是将一个完整的对象进行分解,而分解后的每一部分对象都支持intent所支持的数据类型,这样也实现了传递对象的功能.
同的Person类一样,我们看一个Student类.public class Student implements Parcelable{ private String name ; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public static final Parcelable.Creator<Student> CREATOR = new Parcelable.Creator<Student>() { @Override public Student createFromParcel(Parcel source) { Student student =new Student(); student.name =source.readString();//读取name student.age =source.readInt(); return student; } @Override public Student[] newArray(int size) { return new Student[size]; } }; @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(name);//写出name dest.writeInt(age);//写出age } }同Serializable一样,先实现Parcelable接口,还有必须要重写的两个方法,describeContents和writeToParcel。describeContents方法里面一般都是返回0,writeToParcel方法中我们需要将Student类中的字段一一写出,如String就是writeString.还定义了一个常量CREATOR,是对Parcelable.Creator接口的一个实现,并将泛型指定为Student,需要重写createFromParcel,newArray这两个方法,在createFromParcel中通过source.readString()去读取刚才写出的name和age字段,并创建一个Student对象返回。注意:这里读取一定要和刚才写入的顺序一致。如果不一致,获取到的数值将与原数据不同。然后在B activity获取:Student person = (Student) getIntent().getParcelableExtra("person_data");这里通过调用getSerializableExtra方法获取通过参数传递过来的序列化对象,再讲它向下转型成Student对象,就可以实现了使用intent来传递对象的功能了。(源码在文章底部)对比两种方法,Parcelable方式效率会高一些,因为他是将对象进行分解来传递,所以,一般推荐这种。
源码下载
github