Android:Activity 结果按下返回关闭应用程序

Android: Activity for result pressing back closes the app

在我的应用程序中,我正在打开联系人 activity 以使用新的 Activity 结果 API 选择一个联系人,就像这样

registerForActivityResult(ActivityResultContracts.PickContact()) { it ->
            viewModel.setContact(it) 
        }.launch(null)

联系人 activity 打开,我可以检索联系人,一切正常。但是在联系人 activity 中,按下后退按钮(android 后退按钮或顶部的后退箭头),而不是仅关闭联系人 activity,它会退出我的应用程序.

我在网上找到了针对此问题的修复程序,但仅限于旧的 startActivityForResultonActivityResult API。有没有一种方法可以在为新的 API 打开 activity 时更改后退按钮的行为?

编辑:注意到模拟器和物理设备上的行为

Adrian 好心地向我提供了他的项目样本。 本答案基于调试示例项目的结果。

由于 Java 和 Kotlin 语言的互操作性,代码中存在一个“不可见”问题。当我们从 Kotlin 代码调用 Java 函数时,我们得到 return 类型的 T! - 其中 T! 表示“T 或 T?”。

Java 允许 returning null 值,如我们所愿。为了让 Kotlin 知道该值是显式可选的 Java 程序员必须使用 @Nullable 注释。 Kotlin 会把它取而代之 return T?

由于 registerForActivityResult 是 Java 函数,我们在 return 中得到 registerForActivityResult(ActivityResultContracts.PickContact()) 类型的结果 Uri!.

同样,Uri! 表示“Uri 还是 Uri?” - “值或空值”。

为了以 Kotlin 风格处理这个值,我们可以使用问号 ?:

安全地展开它
activityResultLauncher = registerForActivityResult(ActivityResultContracts.PickContact()) { 
    it?.let { contactUri ->
        viewModel.setContact(contactUri)
    }
}

More about notation for platform types