startActivityForResultAndroid 早期用于「启动 Activity 并接收返回结果」的方法
已在 Android 11(API 30)起被官方标记为废弃(Deprecated)

下面我给你 完整说明 + 旧用法 + 新官方推荐用法(必须会)


一、startActivityForResult 是干嘛的?

👉 启动一个 Activity,并在返回时拿到结果

典型场景:

  • 打开相册 → 返回图片路径
  • 打开登录页 → 返回登录结果
  • 打开设置页 → 返回用户选择

二、旧用法(已废弃,但你一定会见到)

1️⃣ 启动 Activity

Intent intent = new Intent(this, SecondActivity.class);
startActivityForResult(intent, 1001);

2️⃣ 接收返回结果

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == 1001 && resultCode == RESULT_OK) {
        String result = data.getStringExtra("result");
    }
}

3️⃣ 返回结果(SecondActivity)

Intent intent = new Intent();
intent.putExtra("result", "Hello");
setResult(RESULT_OK, intent);
finish();


❌ 旧方式的问题

  • requestCode 容易冲突
  • 生命周期耦合严重
  • Fragment 使用极其混乱
  • 不符合现代架构(ViewModel / Lifecycle)

👉 所以被官方废弃


三、✅ 官方推荐:Activity Result API(必须掌握)

✔ 核心思想

  • 先注册回调
  • 再启动 Activity
  • 生命周期安全
  • Fragment / Activity 通用

四、现代正确写法(强烈推荐)

1️⃣ 注册结果回调

ActivityResultLauncher<Intent> launcher =
        registerForActivityResult(
                new ActivityResultContracts.StartActivityForResult(),
                result -> {
                    if (result.getResultCode() == Activity.RESULT_OK) {
                        Intent data = result.getData();
                        if (data != null) {
                            String value = data.getStringExtra("result");
                        }
                    }
                }
        );

2️⃣ 启动 Activity

Intent intent = new Intent(this, SecondActivity.class);
launcher.launch(intent);

3️⃣ 返回结果(和以前一样)

Intent intent = new Intent();
intent.putExtra("result", "Hello");
setResult(Activity.RESULT_OK, intent);
finish();


五、Kotlin 版(现在最常见)

private val launcher =
    registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
        if (it.resultCode == Activity.RESULT_OK) {
            val result = it.data?.getStringExtra("result")
        }
    }

// 启动
launcher.launch(Intent(this, SecondActivity::class.java))


六、常用 ActivityResultContracts

Contract用途
StartActivityForResult启动普通 Activity
TakePicture拍照
PickVisualMedia选图片(推荐)
RequestPermission请求单个权限
RequestMultiplePermissions多权限

七、什么时候还能看到 startActivityForResult

  • 老项目
  • 老教程
  • Android 8 / 9 项目
  • 公司历史代码(非常多 😅)

👉 新项目、新功能一律不要再用


八、总结一句话

startActivityForResult 已死,Activity Result API 是未来