Activity之间传递数据主要通过Intent。可以传递简单的值,多个复杂的值放在Bundle传递,还可以传递值对象。
下面我通过几个简单的例子演示一下。
一、传递简单的值
1.在activity_main.xml里面添加一个Button。目的是通过点击进入另一个Activity.
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btnStartAty"
android:text="启动另一个Activity"/>
2.在MainActivity.java里面写Button事件监听器的代码。通过Intent的putExtra()方法,把数据发送出去。
findViewById(R.id.btnStartAty).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(MainActivity.this,TheAty.class);
i.putExtra("data","from MainActivity");
startActivity(i);
}
});
3.新建一个Activity,给这个Activity的xml文件中添加一个TextView来显示数据,在java文件中写接收数据的代码,并设置到TextView上。
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_the_aty);
tv = (TextView) findViewById(R.id.tv);
Intent i =getIntent();
tv.setText(i.getStringExtra("data"));
}
二、Bundle传递值
1.在MainActivity.java中
findViewById(R.id.btnStartAty).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(MainActivity.this,TheAty.class);
Bundle b = new Bundle();
b.putString("name","William");
b.putInt("age",20);
i.putExtras(b);
startActivity(i);
}
});
2.在另一个Activity中接收
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_the_aty);
Intent i =getIntent();
Bundle data = i.getExtras();
tv = (TextView) findViewById(R.id.tv);
tv.setText(String.format("name=%s,age=%d",data.getString("name"),data.getInt("age")));
}
三、传递值对象
传递值对象有两种方法,一种是实现Serializable,一种是实现Parcelable,前一种比较简单,但是效率比较低,后一种需要实现一些方法,是专为Android设计,比较高效。
1)实现Serializable。
1.创建User对象,实现Serializable
public class User implements Serializable {
private String name;
private int age;
User(String name,int age){
this.name = name;
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
2.在MainActivity里传递出去
findViewById(R.id.btnStartAty).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(MainActivity.this,TheAty.class);
i.putExtra("user", new User("tang",22));
startActivity(i);
}
});
3.在目标Activity里接收
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_the_aty);
Intent i =getIntent();
User user = (User) i.getSerializableExtra("user");
tv = (TextView) findViewById(R.id.tv);
tv.setText(String.format("name=%s,age=%d",user.getName(),user.getAge()));
}
2)实现Parcelable
在Parcelable里面没有自动序列的机制,需要在writeToParcel()方法里手动的写。
1.在User类里实现Parcelable。
public class User implements Parcelable {
private String name;
private int age;
User(String name,int age){
this.name = name;
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(getName());
dest.writeInt(getAge());
}
public static final Creator<User> CREATOR = new Creator<User>() {
@Override
public User createFromParcel(Parcel source) {
return new User(source.readString(),source.readInt());
}
@Override
public User[] newArray(int size) {
return new User[size];
}
};
}
2.在目标Activity接收
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_the_aty);
Intent i =getIntent();
User user = (User) i.getParcelableExtra("user");
tv = (TextView) findViewById(R.id.tv);
tv.setText(String.format("name=%s,age=%d",user.getName(),user.getAge()));
}