方法startActivity(Intent)是用来启动一个新的活动,这个活动将会被放在活动栈的顶端。这个方法只需要一个Intent类型的参数,来描述将被启动的活动。
有时候你想得到一个活动结束后返回的数据。例如,你可能会启动一个活动来让用户从一张联系人表里选择一个联系人;当这个活动结束时,它将会返回选中的联系人。为了做到这样的事,你可以调用startActivityForResult(Intent,int)方法,第二个integer参数即请求码,用来区别启动的子活动。通过onActivityResult(int, int, Intent)方法得到返回的结果。
当一个活动已经存在,它可以通过setResult(int)方法返回数据给启动它的父活动。这个方法需要一个结果码,可以是官方提供的标准码RESULT_OK、RESULT_CANCELED,也可以是自定义的从RESULT_FIRST_USER(即1)开始的数据(比如1、2、3等)。另外,也可以提供一个包含你想要传递的数据的Intent类型参数。所有这些数据都会出现在启动这个子活动的父活动的onActivityResult()方法中,包括之前提供的请求码。
为了了解startActivityForResult相关方法的具体用法,我写了一下代码作为练习。比较简单,就不写注释了。
public class MainActivity extends AppCompatActivity {
private Button button1, button2;
private TextView textView;
private static final int SECOND = 1;
private static final int THIRD = 2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView)findViewById(R.id.text_main);
button1 = (Button)findViewById(R.id.button1_main);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
String toSecond = "This is Main, Hello Second!";
intent.putExtra("FromMain", toSecond);
startActivityForResult(intent, SECOND);
}
});
button2 = (Button)findViewById(R.id.button2_main);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, ThirdActivity.class);
String toThird = "This is Main, Hello Third!";
intent.putExtra("FromMain", toThird);
startActivityForResult(intent, THIRD);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case SECOND:
if (resultCode == RESULT_OK) {
String fromSecond = data.getStringExtra("FromSecond");
textView.setText(fromSecond);
Toast.makeText(this, "OK", Toast.LENGTH_SHORT).show();
} else if (resultCode == RESULT_CANCELED) {
String fromSecond = data.getStringExtra("FromSecond");
textView.setText(fromSecond);
Toast.makeText(this, "CANCELED", Toast.LENGTH_SHORT).show();
}
break;
case THIRD:
if (resultCode == RESULT_OK) {
String fromThird = data.getStringExtra("FromThird");
textView.setText(fromThird);
Toast.makeText(this, "OK", Toast.LENGTH_SHORT).show();
} else if (resultCode == RESULT_CANCELED) {
String fromThird = data.getStringExtra("FromThird");
textView.setText(fromThird);
Toast.makeText(this, "CANCELED", Toast.LENGTH_SHORT).show();
}
break;
}
}
}
获取两个按钮,一个前往第二个活动,一个前往第三个活动。
在onActivityResult中,第二个活动会返回数据,但是通过判断结果码来判断下一步执行步骤。第三个活动也是这样。
第二个活动的代码:
public class SecondActivity extends AppCompatActivity {
private Button button1, button2;
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
textView = (TextView)findViewById(R.id.text_second);
String fromMain = getIntent().getStringExtra("FromMain");
textView.setText(fromMain);
button1 = (Button)findViewById(R.id.button1_second);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(SecondActivity.this, MainActivity.class);
String toMain = "This is Second A, Hello Main!";
intent.putExtra("FromSecond", toMain);
setResult(RESULT_OK, intent);
finish();
}
});
button2 = (Button)findViewById(R.id.button2_second);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(SecondActivity.this, MainActivity.class);
String toMain = "This is Second B, Hello Main!";
intent.putExtra("FromSecond", toMain);
setResult(RESULT_CANCELED, intent);
finish();
}
});
}
}
第三个活动的代码:
public class ThirdActivity extends AppCompatActivity {
private Button button1, button2;
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_third);
textView = (TextView)findViewById(R.id.text_third);
String fromMain = getIntent().getStringExtra("FromMain");
textView.setText(fromMain);
button1 = (Button)findViewById(R.id.button1_third);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(ThirdActivity.this, MainActivity.class);
String toMain = "This is Third A, Hello Main!";
intent.putExtra("FromThird", toMain);
setResult(RESULT_OK, intent);
finish();
}
});
button2 = (Button)findViewById(R.id.button2_third);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(ThirdActivity.this, MainActivity.class);
String toMain = "This is Third B, Hello Main!";
intent.putExtra("FromThird", toMain);
setResult(RESULT_CANCELED, intent);
finish();
}
});
}
}
Android Studio项目