在 Android 中,startActivityForResult 和 setResult 是用于在不同的 Activity 之间传递数据的重要机制。它们通常用于启动一个新的 Activity,并获取这个 Activity 返回的数据。以下是对这两个方法的详细解析:
1. startActivityForResult
startActivityForResult 是一个用于启动一个新的 Activity 并等待返回结果的方法。在启动目标 Activity 时,你可以传递一些数据(通过 Intent),并且当目标 Activity 完成后,结果会返回到原始 Activity。
基本用法
startActivityForResult 启动目标 Activity,并且通过 onActivityResult 接口接收返回结果。
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivityForResult(intent, REQUEST_CODE);
- 第一个参数:
Context,即当前 Activity 的上下文(通常是this)。 - 第二个参数:请求码
requestCode,用于标识这个请求,可以在返回结果时通过requestCode来区分多个请求。
如何接收返回结果
在启动 Activity 后,目标 Activity 会返回数据。你可以重写当前 Activity 的 onActivityResult 方法来接收数据。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE) { // 确保是我们发起的请求
if (resultCode == RESULT_OK) {
// 处理返回的数据
String result = data.getStringExtra("result");
// 例如显示结果
Toast.makeText(this, "Result: " + result, Toast.LENGTH_SHORT).show();
} else {
// 处理取消或者失败的情况
Toast.makeText(this, "Action canceled", Toast.LENGTH_SHORT).show();
}
}
}
requestCode:请求码,用于标识发起的请求,避免混淆多个请求。resultCode:返回的结果码,通常是RESULT_OK或RESULT_CANCELED,表示目标 Activity 的执行结果。data:一个Intent对象,包含返回的数据(通过Intent.putExtra传递)。
2. setResult
setResult 是用于设置返回结果的方法,在目标 Activity 中调用。当目标 Activity 完成任务后,使用 setResult将结果返回给启动的 Activity。
基本用法
在目标 Activity 中调用 setResult 来设置结果,并通过 finish 方法结束当前 Activity。
// 在 SecondActivity 中
Intent resultIntent = new Intent();
resultIntent.putExtra("result", "This is the result data");
setResult(RESULT_OK, resultIntent);
finish(); // 结束当前 Activity 并返回结果
setResult(int resultCode, Intent data):resultCode:返回的结果码,通常是RESULT_OK或RESULT_CANCELED。data:包含返回数据的Intent,可以使用Intent.putExtra将数据附加到Intent对象中。
RESULT_OK 和 RESULT_CANCELED
RESULT_OK:表示操作成功,通常表示 Activity 正常完成,返回结果有效。RESULT_CANCELED:表示操作失败或被取消,通常表示用户退出或返回,没有有效的结果。
完整示例:启动并返回数据
MainActivity.java(启动 Activity)
public class MainActivity extends AppCompatActivity {
private static final int REQUEST_CODE = 100; // 请求码
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 启动 SecondActivity
findViewById(R.id.button_start_activity).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivityForResult(intent, REQUEST_CODE);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE) {
if (resultCode == RESULT_OK) {
// 处理返回的数据
String result = data.getStringExtra("result");
Toast.makeText(this, "Received: " + result, Toast.LENGTH_SHORT).show();
} else {
// 处理取消的情况
Toast.makeText(this, "Action canceled", Toast.LENGTH_SHORT).show();
}
}
}
}
SecondActivity.java(目标 Activity)
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
findViewById(R.id.button_return_result).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 设置返回结果
Intent resultIntent = new Intent();
resultIntent.putExtra("result", "This is the result data");
setResult(RESULT_OK, resultIntent); // 返回结果
finish(); // 结束 SecondActivity
}
});
}
}
3. 总结
startActivityForResult用于启动一个新的 Activity 并等待返回结果,通过onActivityResult接收返回的数据。setResult在目标 Activity 中设置返回结果,并通过finish结束 Activity。RESULT_OK和RESULT_CANCELED是常用的返回码,表示操作是否成功。
4. 注意事项
- 生命周期管理:使用
startActivityForResult和onActivityResult需要注意 Activity 的生命周期。当 Activity 进入后台时,onActivityResult可能会被延迟调用。对于复杂场景,考虑使用onSaveInstanceState和onRestoreInstanceState来保存和恢复数据。 - 权限请求:Android 6.0(API 23)及更高版本中,权限请求改用了
ActivityResultContracts类,startActivityForResult已经被弃用,建议使用新的ActivityResultLauncher来替代。
希望这能帮助你更好地理解 startActivityForResult 和 setResult 的使用!如果有其他问题,随时告诉我!
发表回复