在 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
的使用!如果有其他问题,随时告诉我!
发表回复