在上一章创建两个activity的基础上,这章我们简单介绍一下不同activity之间传递数据的方法(有其他方法日后学到继续补充)
一、在activity传递简单的数据
在activity之间传递简单数据如int,string类型的数据一般采用基于消息的通信机制intent,在上一章中我们知道intend可以用来启动另外一个activity,不仅如此intend还可以用来传递数据
intent包含两个部分:
1、目的地:要到哪里去
2、携带的内容:及传递的数据
程序传递的过程如下所示:
Intent i = new Intent(MainActivity.this,Bactivity.class);首先申明一个intent,其中MainActivity.this是源,Bactivity.class是目的地
i.putExtra("junson", "Hello,I am A activity");然后将数据传入intent对象中,junson是用来区分数据的,"Hello,I am A activity"是传递的内容
startActivity(i);然后将数据发送过去
在接受的Bactivity中,采用如下方法接收数据:
Intent i = getIntent();申明一个intent对象,获取发送过来的intend消息
Btv = (TextView)findViewById(R.id.Btext);找一个textview用来显示接收到的消息
Btv.setText(i.getStringExtra("junson"));显示junson消息
这种方式只能传递简单的数据类型:
根据需要传递的数据类型进行选择和区分。
二、在activity之间传递复杂数据
传递复杂数据我们可以利用android.os.Bundle对象封装数据的能力来传递数据包,通过Bundle来传递不同intent之间的数据,Bundle对象针对不同的数据类型提供了许多的方法,例如传递string类型等。
实现过程如下:
Intent i = new Intent(MainActivity.this,Bactivity.class);
Bundle Bd= new Bundle();申明一个bundle对象
Bd.putString("junson", "hello,i am not a activity");填充数据1
Bd.putInt("xiaolian", 25);填充数据2
i.putExtras(Bd);把数据发送出去
startActivity(i);
在接受数据的activity中
Btv = (TextView)findViewById(R.id.Btext);
Intent i = getIntent();
Bundle data = i.getExtras();//接受传递过来的消息
Btv.setText(String.format("what:%s,xiaolian:%d", data.getString("junson"),data.getInt("xiaolian")));//现实传递过来的消息
三、在activity之间传递自定义的值对象
如果你想在activity之间传递自定义的数据类型我们可以利用java包中提供的Serializable方法或者android os提供的Parcelable方法:
首先我们创建一个我们需要传递的数据类型
public class UserData{
private String name;
private int age;
public UserData(String name,int age){
this.name = name;
this.age = age;
}
public void setname(String name){
this.name = name;
}
public String getname(){
return this.name;
}
public void setage(int age){
this.age = age;
}
public int getage(){
return this.age;
}
@Override
public int describeContents() {
// TODO Auto-generated method stub
return 0;
}
如上所示,我们定义了一个UserData自定义的数据类型,里面包含了一个string类型的name数据和一个int类型的age数据
1、使用java的Serializable方法的程序如下所示:
Intent i = new Intent(MainActivity.this,Bactivity.class);
i.putExtra("junson", new UserData("junson",25));//使用匿名内部类发送数据
在接收端
UserData data = (UserData) i.getParcelableExtra("junson");
Btv.setText(String.format("User info(name=%s,age=%d)", data.getname(),data.getage()));
使用使用java的Serializable方法需要将自定义的数据类型的申明改成
public class UserData implements Serializable即可
2、使用android os提供的Parcelable方法
使用Parcelable方法需要将自定义数据类型的申明改成
public class UserData implements Parcelable{
private String name;
private int age;
public UserData(String name,int age){
this.name = name;
this.age = age;
}
public void setname(String name){
this.name = name;
}
public String getname(){
return this.name;
}
public void setage(int age){
this.age = age;
}
public int getage(){
return this.age;
}
@Override
public int describeContents() {
// TODO Auto-generated method stub
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
// TODO Auto-generated method stub
dest.writeString(getname());
dest.writeInt(getage());
}
public static final Creator<UserData> CREATOR = new Creator<UserData>() {
public UserData createFromParcel(Parcel source){
return new UserData(source.readString(),source.readInt());
}
public UserData[] newArray(int Size){
return new UserData[Size];
}
};
}
并完成writeToParcel和public static final Creator<UserData> CREATOR = new Creator<UserData>() 的接口
其他方法一样。