Android Studio Java:子Activity返回的Intent在父Activity回退时未被接收
核心问题原因
Intent.FLAG_ACTIVITY_FORWARD_RESULT的作用是将当前Activity的跳转请求来源转发给下一个Activity,也就是说子Activity的返回结果会直接传给启动SetListMasterViewActivity的组件(即SetListEditAdapter所在上下文),而非SetListMasterViewActivity本身——这就是父ActivityonActivityResult完全不触发的根本原因。再加上FLAG_ACTIVITY_SINGLE_TOP让父Activity复用实例,进一步导致你无法在父Activity内直接接收子Activity的返回结果。
具体修复步骤
移除
Intent.FLAG_ACTIVITY_FORWARD_RESULT标记
启动子Activity时,直接用常规的startActivityForResult()(AndroidX环境建议用registerForActivityResult()),不要使用转发标记。示例代码:// 父Activity SetListMasterViewActivity中启动子Activity的代码 Intent intent = new Intent(this, SetListOpenViewActivity.class); intent.putExtras(yourData); startActivityForResult(intent, REQUEST_CODE_SET_LIST_OPEN); // 自定义请求码常量AndroidX环境下的写法:
// 父Activity中初始化Launcher ActivityResultLauncher<Intent> openSetListLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), result -> { if (result.getResultCode() == RESULT_OK && result.getData() != null) { Intent resultIntent = result.getData(); // 在这里处理子Activity返回的数据 } } ); // 启动子Activity时调用 Intent intent = new Intent(this, SetListOpenViewActivity.class); intent.putExtras(yourData); openSetListLauncher.launch(intent);按需调整父Activity的启动标记
如果业务不需要FLAG_ACTIVITY_SINGLE_TOP,可直接移除;若必须保留,需在父Activity的onNewIntent()中更新Intent并处理逻辑:@Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent); // 更新为新Intent // 在这里处理新Intent携带的数据 }注意:此步骤仅处理父Activity复用实例时的Intent更新,和接收子Activity返回结果是独立逻辑。
子Activity返回代码保持不变
确保子Activity返回结果的代码正确:// 子Activity SetListOpenViewActivity中返回结果的代码 Intent resultIntent = new Intent(); resultIntent.putExtras(yourResultData); setResult(RESULT_OK, resultIntent); finish();
额外注意事项
- 不要误用
FLAG_ACTIVITY_FORWARD_RESULT:该标记仅适用于不需要当前Activity处理返回结果,需将结果直接传递给上上游组件的场景,显然你的场景不符合。 - Android 11及以上版本,注意Activity启动模式和权限配置,避免其他限制导致结果无法传递。
内容的提问来源于stack exchange,提问作者kiteandwindsurfer

