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