Android使用registerForActivityResult启动Activity时因生命周期状态问题导致应用崩溃求助
解决registerForActivityResult在RESUMED状态注册的崩溃问题
嘿,这个问题我之前踩过坑!看错误日志就能定位核心原因:你不能在Activity已经进入RESUMED状态后才调用registerForActivityResult()——也就是不能像现在这样把注册逻辑写在用户点击触发的launchEditView函数里。
为什么会崩溃?
registerForActivityResult()有严格的生命周期要求:必须在LifecycleOwner(这里就是你的MainActivity)处于CREATED到STARTED之间完成注册,简单说就是要在Activity初始化阶段就注册好,而不是等到用户触发操作(此时Activity已经处于RESUMED状态)才临时注册。
修复方案:提前注册Launcher
只需要把注册逻辑移到Activity的onCreate()方法里,提前初始化好ActivityResultLauncher,然后在需要启动EditActivity的时候直接调用它的launch()方法就行。具体修改如下:
class MainActivity : AppCompatActivity() { // 提前声明全局的ActivityResultLauncher变量 private lateinit var editActivityLauncher: ActivityResultLauncher<Intent> // 用来临时保存要编辑的列表位置 private var currentEditPosition: Int = -1 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 在这里完成注册,此时Activity处于CREATED状态,完全符合生命周期要求 editActivityLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == Activity.RESULT_OK && currentEditPosition != -1) { val updatedTask = result.data?.getStringExtra("alternative") updatedTask?.let { listOfTasks.set(currentEditPosition, it) adapter.notifyDataSetChanged() saveItems() } // 重置位置标记 currentEditPosition = -1 } } // 其他初始化逻辑(比如初始化列表、适配器等)... } fun launchEditView(position: Int) { // 先保存要编辑的位置,方便回调里使用 currentEditPosition = position val intent = Intent(this, EditActivity::class.java) intent.putExtra("taskName", listOfTasks[position]) // 直接调用提前注册好的Launcher启动Activity editActivityLauncher.launch(intent) } }
补充说明
这里用currentEditPosition变量来传递要修改的列表位置,因为回调函数里没法直接拿到launchEditView的position参数,这个小细节要注意。修改后,注册逻辑在Activity创建时就完成了,完全符合系统的生命周期规则,不会再触发IllegalStateException。
内容的提问来源于stack exchange,提问作者Dat Le
相关产品推荐
相关产品推荐

