Android 应用在使用 registerForActivityResult 启动另一个 activity 时退出

Android app exits when launch another activity using registerForActivityResult

我有 2 个 类 MainActivity 和 EditActivity。我尝试在 MainActivity 中使用 registerForActivityResult() 启动 EditActivity,但应用程序立即退出; startActivity() 工作正常,但 registerForActivityResult() 符合我的目的,即将结果返回到 MainActivity。启动EditActivity的函数如下。

MainActivity.kt

fun launchEditView(position: Int) {
        val getResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
            if(it.resultCode == Activity.RESULT_OK){
                val value = it.data?.getStringExtra("alternative")
                listOfTasks.set(position, value.toString())
                adapter.notifyDataSetChanged()
                saveItems()
            }
        }
        // first parameter is the context, second is the class of the activity to launch
        val intent = Intent(this, EditActivity::class.java)
        intent.putExtra("taskName", listOfTasks.get(position))

        getResult.launch(intent)
    }

更新:错误是

java.lang.IllegalStateException: LifecycleOwner com.example.simpletodo.MainActivity@3a90598 is attempting to register while current state is RESUMED. LifecycleOwners must call register before they are STARTED.
        at androidx.activity.result.ActivityResultRegistry.register(ActivityResultRegistry.java:123)
        at androidx.activity.ComponentActivity.registerForActivityResult(ComponentActivity.java:682)
        at androidx.activity.ComponentActivity.registerForActivityResult(ComponentActivity.java:691)
        at com.example.simpletodo.MainActivity.launchEditView(MainActivity.kt:86)

您看到的 logcat 问题是您尝试在错误的状态下注册。您必须在 activity 状态恢复到恢复状态之前执行此操作。因此,要解决此问题,您必须在 activity 的 onCreate 方法中注册并持有启动器实例。然后任何时候你想开始另一个 activity 你都可以使用它。作为示例代码:

lateinit var launcher: ActivityResultLauncher

override fun onCreate(savedInstanceState: Bundle?) {
    //The common logic of onCreate method
    val launcher= registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
            if(it.resultCode == Activity.RESULT_OK){
                val value = it.data?.getStringExtra("alternative")
                listOfTasks.set(position, value.toString())
                adapter.notifyDataSetChanged()
                saveItems()
            }
        }
}

fun launchEditView(position: Int) {
        val intent = Intent(this, EditActivity::class.java)
        intent.putExtra("taskName", listOfTasks.get(position))
        launcher.launch(intent)
    }