概述
可以直接使用startActivity(Intent intent)
方法从一个Activity跳转至另一个Activity,但有时候需要Activity返回数据,例如:
Activity_A
开启了Activity_B
,用户在Activity_B
中进行一些操作后按下Back
键,Activity_B
返回到Activity_A
。在这一过程Activity_A
要求Activity_B
返回数据。
使用startActivity(Intent intent)
方法固然可以,但当Activity_A
要求多个其它Activity也返回数据时,使用startActivity(Intent intent)
方法就显得繁琐。
这种情况下使用startActivityForResult()
方法。
StartActivityForResult()
Intent intent=new Intent(this,TargetActivity.class);
intent.putExtra("hello","HelloWorld");
//launch TargetActivity
intent.startActivityForResult(intent,0);
参数解析
startActivityForResult()
在Activity.java
中的定义为:
public void startActivityForResult(Intent intent,int requestCode)
Intent intent
这个参数是一个Intent
实例,用来Activity切换发起方向目标方传递数据。
int requestCode
这个参数用来标识不同的子Activity返回的数据,当前Activity要求多个子Activity返回数据时,使用requestCode
来区分接收的数据是哪个Activity返回的。
onActivityResult()
@Override
protected void onActivityResult(int requestCode,int resultCode,Intent data) {
//some statement
}
这个方法用来处理子Activity的返回,子Activity返回时,接收返回的Activity会直接进入此方法。因此,Activity要求子Activity返回数据,自身先要重写此方法。
参数解析
onActivityResult()
在Activity.java
中的定义为:
protected void onActivityResult(int requestCode,int resultCode,Intent data)
int requestCode
这个参数对应startActivityForResult(Intent intent,int requestCode)
方法中的requestCode
,即用来区分返回的数据来自于哪个子Activity。
int resultCode
这个参数用来区分一个子Activity返回的数据类型,对应下面将要讨论的setResult(int resultCode,Intent intent)
方法中的resultCode
。因为接收返回的Activity无法确定返回的是什么类型的数据,可能是String
型,也可能是double
型…,使用resultCode
来约定指代返回数据的类型,然后使用不同的getXXXExtra()
方法来接收返回的数据。
Intent data
这个参数是一个包含有返回数据的Intent对象,使用data.getXXXExtra()
方法即可得到子Activity返回的数据。
提要
requestCode
用于区分不同子Activity的返回数据;resultCode
用于约定指代一个子Activity返回数据的类型。
完整的Activity切换发起方代码
CurrentActivity.java
import...
import java.io.Serializable;
public class CurrentActivity extends Activity
implements View.OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//load currentActivity.xml
setContentView(R.layout.currentActivity);
Button btn_1=(Button)findviewById(R.id.btn_1);
btn_1.setOnClickListener(this);
}
@Override
protected void onClick(View v) {
Person person=new Person();
Intent intent=new Intent(this,TargetActivity.class);
intent.putExtra("Lishaoyin",person);
startActivityForResult(intent,0);
}
@Override
protected void onActivityResult(int requestCode,int resultCode,Intent data) {
String str_Data;
double dbl_Data;
Person Pes_Data;
if(requestCode==0) {
if(resultCode==0) str_Data=data.getStringData("name");
else if(resultCode==1) dbl_Data=data.getDoubleData("name");
else if(resultCode==2) pes_Data=(Person)data.getSerializableExtra("name");
...
}
else if(requestCode==1)
...
}
}
Person.java
import...
import java.io.Serializable;
public class Person implements Serializable {
private String name;
private float height;
public void setName(String name) {
this.name=name;
}
public void setHeight(float height) {
this.height=height;
}
public String getName() {
return name;
}
public float getHeight() {
return height;
}
}
setResult()
@Override
public void onBackPressed(){
Person person=new Person();
person.setName("Tony Stark");
person.setHeight(1.78);
Intent intent =new Intent(); //use Intent() without Param
intent.putExtra("Tony",person);
setResult(0,intent);
super.onBackPressed(); //back
}
以上代码重写了public void onBackPressed()
方法,用户在按Back
键时系统会调用此方法。代码中首先创建了Intent对象,用Intent对象发出数据,再使用setResult()
方法返回数据给切换Activity发起方。
注意不要使用Intent(Context packageContext, Class<?> cls)
版本去指定跳转指向,也不要使用setClass()
指定,因为Activity返回时跳转指向是明确的,直接使用Intent intent=new Intent()
创建intent即可。
参数解析
setResult()
在Activity.java
中的定义为:
public final void setResult(int resultCode,Intent data)
int resultCode
这个参数用于约定指代返回数据的类型,对应于上面讨论的onActivityResult(int requestCode,int resultCode,Intent data)
方法中的resultCode
。
Intent data
这个参数即为包含有返回数据的Intent对象。
完整的Activity切换接收方代码
TargetActivity.java
import...
public class TargetActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//load targetActivity.xml
setContentView(R.layout.targetActivity);
}
@Override
public void onBackPressed(){
Person person=new Person();
person.setName("Tony Stark");
person.setHeight(1.78);
Intent intent=new Intent();
intent.putExtra("Tony",person);
setResult(0,intent);
super.onBackPressed();
}
}
欢迎指正