您的位置:首页 > 移动开发 > Android开发

5.使用Intent实现Activity之间对象的传输

2017-05-15 22:28 501 查看
由于前面写了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");


总结:第一种方法简单,但是第二种在性能上有优势
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android
相关文章推荐