You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RegisterForActivityResult与rememberLauncherForActivityResult未等待Activity异常

解决RegisterForActivityResult/rememberLauncherForActivityResult回调异常问题

以下是针对你遇到的「回调先返回RESULT_CANCELED再打开目标页面、退出后无结果回调」问题的排查和修复方案:

1. 规范Launcher的注册时机

  • View系统场景:registerForActivityResult必须在Activity的onCreate或Fragment的onCreateView阶段完成注册,绝对不能在点击事件等动态回调里临时创建。否则系统会因为Launcher未正确绑定生命周期,提前触发取消回调,之后才启动目标页面。
  • Compose场景:rememberLauncherForActivityResult必须用remember包裹,确保它与Composable的生命周期绑定,不能在Button的onClick内创建。每次点击生成新Launcher会导致旧实例被销毁,后续结果无法正确回调。

2. 修正目标Activity的结果返回逻辑

退出目标页面时,必须先设置正确的结果码和数据,再调用finish(),不能直接退出:

// PDFActivity 退出按钮的正确实现
btnExit.setOnClickListener {
    // 如需返回数据,封装到Intent中
    val resultIntent = Intent().apply {
        putExtra("pdf_result", "操作完成")
    }
    setResult(Activity.RESULT_OK, resultIntent)
    finish()
}

如果是通过系统返回键退出,需要重写返回逻辑来设置结果:

override fun onBackPressed() {
    setResult(Activity.RESULT_OK)
    super.onBackPressed()
}
// Android 13+ 推荐使用OnBackPressedDispatcher
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    onBackPressedDispatcher.addCallback(this) {
        setResult(Activity.RESULT_OK)
        finish()
    }
}

3. 检查Launcher的调用逻辑

确保调用launch()时传入的Intent正确无误,且目标Activity已在Manifest中注册:

// Compose中正确的调用示例
val pdfLauncher = rememberLauncherForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
    when(result.resultCode) {
        Activity.RESULT_OK -> {
            // 处理返回结果
            val data = result.data?.getStringExtra("pdf_result")
        }
        Activity.RESULT_CANCELED -> {
            // 处理取消场景
        }
    }
}

Button(onClick = {
    val intent = Intent(context, PDFActivity::class.java)
    pdfLauncher.launch(intent)
}) {
    Text("打开PDF页面")
}

4. 排查生命周期异常

如果原页面在启动目标Activity后被销毁(比如屏幕旋转等配置变化),会导致Launcher实例丢失,无法接收回调。可以:

  • View系统中:将Launcher注册到ViewModel(需传入ActivityResultRegistryOwner)
  • Compose中:用rememberSaveable确保Launcher在重组时保留,或把Launcher放在与ViewModel绑定的Composable中

内容的提问来源于stack exchange,提问作者jetberrocal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 17:00:04