由于前面写了Intent,就一起写,这个是Intent的高级使用,可以不看先
通常有两种实现方式
1.Serializable 序列化对象,将对像转换成可传输的状态,比如二进制。
具体代码:
先看看要被传输的对象的类Person
//实现了这个接口后,就是通知了系统,该类的实例可以被序列化
public class Person implements Serializable{
private String name;
private int age;
public Person (String name,int age){
this.name=name;
this.age=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;
}
}
接下来看看主函数
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button sendDate=(Button)findViewById(R.id.sendDate);
sendDate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//初始化person
Person person=new Person("lee",19);
Intent intent =new Intent(MainActivity.this,SecondActivity.class);
//向SecondActivity传递person实例,将对象存在Intent中,key为lee
intent.putExtra("lee",person);
startActivity(intent);
}
});
再看看要接收的改动对象的Activity
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
//取出对象
Person person=(Person)getIntent().getSerializableExtra("lee");
//测试有没有取出
Log.d("ssssss",person.getName()+"\t"+person.getAge());
}
}
2.Parcelable方式
原理:将对象分解成很多部分,所有的部分都是Intent所支持传输的数据类型,其实解析,再组合出来,都是在Person类中进行的,所以在前面的基础上,实现一个Parcelable接口,复写一些方法,就可以了,那些复写的方法就是用来传输时解析对象,组合对象用的,
看Person类代码:
//实现Parcelable接口
public class Person implements Parcelable{
private String name;
private int age;
public Person (String name,int age){
this.name=name;
this.age=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;
}
//复写该方法用来进行数据的写出,存到dest中
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeInt(age);
}
//默认要复写的,一般返回0就好
@Override
public int describeContents() {
return 0;
}
//还必须要提供一个CREATOR常量,注意泛型都是要传输的对象类
//这里用了个接口的实现,在里面对数据读出来,并返回对象
public static final Parcelable.Creator<Person> CREATOR=new Parcelable.Creator<Person>(){
@Override
public Person createFromParcel(Parcel source) {
//由于前面先写入的是name,这里必须先读取
String name=source.readString();
int age=source.readInt();
Person person=new Person(name,age);
return person;
}
//这里按要求复写就好
@Override
public Person[] newArray(int size) {
return new Person[size];
}
};
}
MainAcitvity中代码不变,
那在SecondActivity中取对象怎么取???
//取出对象
Person person=(Person)getIntent().getParcelableExtra("lee");
总结:第一种方法简单,但是第二种在性能上有优势