启动未注册ActivityResultLauncher崩溃问题求助
解决ActivityResultLauncher调用launch()崩溃的问题
问题根源
你直接在成员变量声明时调用registerForActivityResult()是错误的。这个方法必须绑定到Activity/Fragment的生命周期,只能在**组件初始化阶段(比如Activity的onCreate方法内)**调用。如果在成员变量定义时直接初始化,此时Activity还未完成创建,launcher没有正确完成注册绑定,后续调用launch()就会触发未注册的异常,尤其是Activity重建(如屏幕旋转)时,旧的launcher会直接失效。
正确实现方案
- 仅声明launcher变量,不直接初始化
private lateinit var launcher: ActivityResultLauncher<Intent>
- 在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 // 处理返回的数据 } } }
- 在需要的场景调用
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
相关产品推荐
相关产品推荐

