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

启动未注册ActivityResultLauncher崩溃问题求助

解决ActivityResultLauncher调用launch()崩溃的问题

问题根源

你直接在成员变量声明时调用registerForActivityResult()是错误的。这个方法必须绑定到Activity/Fragment的生命周期,只能在**组件初始化阶段(比如Activity的onCreate方法内)**调用。如果在成员变量定义时直接初始化,此时Activity还未完成创建,launcher没有正确完成注册绑定,后续调用launch()就会触发未注册的异常,尤其是Activity重建(如屏幕旋转)时,旧的launcher会直接失效。

正确实现方案

  1. 仅声明launcher变量,不直接初始化
private lateinit var launcher: ActivityResultLauncher<Intent>
  1. 在Activity的onCreate()方法内完成注册(必须在super.onCreate(savedInstanceState)之后执行)
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    // 在这里注册ActivityResultLauncher
    launcher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
        // 处理返回结果的逻辑
        if (result.resultCode == RESULT_OK) {
            val data = result.data
            // 处理返回的数据
        }
    }
}
  1. 在需要的场景调用launch(),比如点击事件监听器中
yourButton.setOnClickListener {
    val targetIntent = Intent(this, TargetActivity::class.java)
    launcher.launch(targetIntent)
}

额外注意事项

  • 避免在异步回调(如网络请求回调)中直接调用launch(),如果此时Activity已经处于销毁/即将销毁状态,同样会触发异常。可以先判断Activity状态:
if (!isFinishing && !isDestroyed) {
    launcher.launch(targetIntent)
}
  • 如果是在Fragment中使用,需在Fragment的onCreate()或onViewCreated()方法内注册launcher,同样不能在成员变量直接初始化。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 06:07:39