曾经沧海难为水,除却巫山不是云。 ——元稹《离思五首·其四》
Activity之间通过Intent传递数据时用到请求码和结果码
请求码(requestCode)
startActivityForResult()
主Activity带着请求码跳到一个新的Activity界面。
onActivityResult()
关闭通过startActivityForResult开启的Activity时,会触发主Acvitity的onActivityResult方法,那么由于
之前主Activity发送了一个请求码,这时候就可以根据请求码判断是从哪 界面回来的了。
当然以可以根据结果码来判断。
public void startActivityForResult(android.content.Intent intent,
int requestCode)
MainActivity.java
//跳转到另一个activity,携带数据 name和age, requestCode为1
Intent intent = new Intent(this,TwoActivity.class);
intent.putExtra("name","你好");
intent.putExtra("age",12);
startActivityForResult(intent,1);
---------------------------------------------------------------------------------------
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode){
case 1:
String message =data.getStringExtra("message");
Toast.makeText(this,message,Toast.LENGTH_SHORT).show();
break;
case 2:
Toast.makeText(this,"threeactivity的请求码",Toast.LENGTH_SHORT).show();
break;
}
/*switch (resultCode){
case 1:
String message =data.getStringExtra("message");
Toast.makeText(this,message,Toast.LENGTH_SHORT).show();
break;
case 2:
break;
}*/
}
TwoActivity.java
String name =getIntent().getStringExtra("name");
int age = getIntent().getIntExtra("age",0);
/**public int getIntExtra (String name, int defaultValue)
*defaultValue
*如果没有所需类型的值与所需的类型的值存储的值将被返回 则返回defaultValue值
*/
Toast.makeText(this,name+" "+age,Toast.LENGTH_SHORT).show();
结果码(resultCode)
setResult
setResult(int resultCode)
设置传递到上一个界面的结果码,不传递数据setResult(int resultCode, Intent data)
设置传递到上一个界面的数据
TwoActivity.java
String message ="我是TwoActivity返回的";
Intent intent =new Intent();
intent.putExtra("message",message);
setResult(11,intent);
//设置结果码为11
finish();
注意
结果码和请求码最好设置为静态常量
public static final int REQUESTCODE =1;
2016年8月25日 补充 -Serializabl和Parcelable
Intent里putExtra()方法中所支持的数据类型是有限的,但是当你想去传递一些自定义对象的时候就必须用到下面的方法
Serializable方式
Serializable是序列化的意思,表示将一个对象转换成可存储或可传输的状态。序列化后的对象可以在网络上进行传输,也可以存储到本地。至于序列化的方法也很简单,只需要让一个类去实现Serializable这个接口就可以了。
比如说有一个Person类,其中包含了name和age这两个字段,想要将它序列化就可以这样写:
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;
}
}
接下来在FirstActivity中的写法非常简单:
Person person = new Person();
person.setName("Tom");
person.setAge(20);
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("person_data", person);
startActivity(intent);
接下来在SecondActivity中获取这个对象也很简单,写法如下:
Person person = (Person) getIntent().getSerializableExtra("person_data");
Parcelable方式
User.java
public class User implements Parcelable {
private String name;
private int age;
public static final Creator<User> CREATOR = new Creator<User>() {
@Override
public User createFromParcel(Parcel in) {
User user =new User();
user.name = in.readString();
user.age = in.readInt();
return user;
}
@Override
public User[] newArray(int size) {
return new User[size];
}
};
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeString(name);
parcel.writeInt(age);
}
}
FirstActivity中的写法
public void click3(View view) {
User user= new User();
user.setName("peng");
user.setAge(26);
Intent intent = new Intent(this,TwoActivity.class);
intent.putExtra("user_data",user);
startActivity(intent);
}
TwoActivity中的写法
User user =(User) getIntent().getParcelableExtra("user_data");
Toast.makeText(this,user.getName()+" "+user.getAge(),Toast.LENGTH_SHORT).show();