Intent可以用于启动活动、发送广播、启动服务等等,还可以在Intent添加一些数据,以达到传值的效果
传递常见数据类型的数据(如int,String):(这里仅仅假设在Activity1,传递到Activity2)
① Intent. putExtra( "Key" ,value),添加要传递的数据 (Activity1中)
Intent intent = new Intent(Activity1.this, Activity2.class);
intent.putExtra("StringData","hello");
intent.putExtra("intData",123);
startActivity(intent);
② getIntent() . getXxxTypeExtra(" Key ") 获取数据类型为XxxType的数据 (XxxType如Int,String) (Activity2中)
getIntent().getStringExtra("StringData");
getIntent().getIntExtra("intData");
酱紫,就可以从Activity1传递数据给Activity2了,不过,单纯的putExtra()并不能传递对象只能传递一些普通数据类型的数据。
要使得Intent能传递对象,有两种方法:Serializable(序列化)和Parcelable(打包的)
Serializable(序列化的):
Serializable是序列化的意思,表示将一个对象转换成 可存储或可传输 的状态。序列化后的对象,可以在 网络上传输 或 存储到本地
① Serializable序列化 方法:只需要让一个类去实现Serializable接口即可,这样此类的所有对象都是序列化的、可以传输的
public class Person implements Serializable {
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;
}
}
② 在Activity1中,传递可以这样写:因为Person类实现了Serializble接口即序列化了,所以Person的对象可以传输
Person person=new Person();
person.setName("臭居居");
person.setAge("22");
//因为Person类实现了Serializble接口即序列化了,所以Person的对象可以传输
Intent intent=new Intent(Activity1.this, Activity2.class);
intent.putExtra("personData",person); //携带person对象
startActivity(intent);
③ 在Activity2中,获取方法是:( 类名)getIntent(). getSerializableExtra("person_data"),而不是getStringExtra之类的了
Person person =( Person )getIntent().getSerializableExtra("personData")
注意,获取对象的时候,要将它向下转型成Person对象。最终,Intent完成传递对象了
Parcelable(打包的):分解对象成Intent所支持的数据类型
Parcelable方式的原理是,将一个 完整的对象 进行分解,分解后的每一部分都是Intent所支持的数据类型,这样也可以实现对象的传递。
① 首先,也是让一个类实现Parcelable接口,不过还需重写describeContents() 和writeToParcel(Parcel parcel, int i) ,并提供一个CREATOR常量:
public class Person 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;
}
//重写describeContents(),这个没什么写,直接返回0即可
@Override
public int describeContents() {
return 0;
}
//重写writeToParcel(Parcel parcel, int i)
//在这里,需要将此类Person的字段属性,用参数1的Parcel的writeXxx(字段名) 一一写出
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeString(name); //写出字段name
parcel.writeInt(age); //写出字段age
}
//最后,需提供一个 Parcelable的常量CREATOR ,泛型指定为本类Person
public static final Parcelable.Creator<Person> CREATOR=new Parcelable.Creator<Person>(){
//重写createFromParcel,
// 在这里,用parcel的readXxx(字段名) 读取刚才写出的Person字段
@Override
public Person createFromParcel(Parcel parcel) {
Person person=new Person();
person.name=parcel.readString();//读取name字段
person.age=parcel.readInt(); //读取age字段
return person; //返回person对象
}
//重写newArray(int i),返回一个Person数组即可
@Override
public Person[] newArray(int i) {
return new Person[i];
}
};
}
注意,在重写writeToParcel(Parcel parcel, int i)时,用parcel.writeXxx(name)写出字段的顺序
和 在重写createFromParcel(Parcel parcel)时,用parcel.readXxx( )的 读取字段的顺序 一致,才能读取准确
②在Activity1传递 :
Person person=new Person();
person.setName("臭居居");
person.setAge("22");
//因为Person类实现了Serializble接口即序列化了,所以Person的对象可以传输
Intent intent=new Intent(Activity1.this, Activity2.class);
intent.putExtra("personData",person); //携带person对象
startActivity(intent);
③ 在Activity2中获取,有些不同,而是用getIntent().getParcelableExtra(" Key "):
Person person =( Person )getIntent().getParcelableExtra("personData")
注意,获取对象的时候,要将它向下转型成Person对象。最终,Intent完成传递对象了
总结:
Serializable 和 Parcelable都可以实现Intent传递对象,Serializable 实现简单不用重写什么方法不过因为会把整个对象序列化,效率比Parcelable低一些。