startActivityForResult 是 Android 早期用于「启动 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 是未来
发表回复