📜  kotlin registerForActivityResult - Java (1)

📅  最后修改于: 2023-12-03 15:32:30.121000             🧑  作者: Mango

Kotlin registerForActivityResult - Java

在 Android 中,Activity 和 Fragment 是实现业务逻辑的重要组件。Activity 和 Fragment 扮演着用户界面和业务逻辑之间的桥梁,历来是 Android 开发的重点。

而在 Kotlin 中,registerForActivityResult 出现了,它可以更好地协助我们处理 Activity 和 Fragment 的交互及其返回数据。接下来,我们将重点介绍 Kotlin 中的 registerForActivityResult。

什么是 registerForActivityResult?

registerForActivityResult 是一个新的 API,旨在更加简化 Activity 和 Fragment 的交互,并提供一种更好的方式来处理返回的数据。它是在 AndroidX 框架中引入的。

为什么要使用 registerForActivityResult?

在以往,我们经常使用 startActivityForResult 或者 Fragment 中的 startActivityForResult 方法,来启动一个 Activity 并等待其返回结果。但是,在使用此方法时,返回的数据并不能很好地传递给我们的应用程序,并且在 API >= 23 的情况下,还需要进行运行时权限处理。

这时,registerForActivityResult 的出现,能够更加简单地处理 Activity 和 Fragment 的返回数据,同时也可以轻松处理权限请求。

如何使用 registerForActivityResult?
创建 ActivityResultLauncher

使用 registerForActivityResult 创建一个 ActivityResultLauncher,用于启动你需要的 Activity 并等待返回数据。只需要提供一个 ActivityResultCallback,它将在 Activity 返回数据时被调用。

val someActivityResultLauncher = registerForActivityResult(
    ActivityResultContracts.StartActivityForResult()) { result ->
        if (result.resultCode == Activity.RESULT_OK) {
            // 在这里处理返回的数据
            val data: Intent? = result.data
        }
    }
启动Activity

然后,你可以像以前一样启动一个 Activity,但是这次使用新创建的 ActivityResultLauncher 并等待回调。

someActivityResultLauncher.launch(intent)
启动权限请求

除了启动 Activity,registerForActivityResult 还可以使用 ActivityResultContracts.RequestPermission 统一处理权限请求。

val requestPermissionLauncher =
    registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted: Boolean ->
        if (isGranted) {
            // 权限已授予,在此处执行逻辑
        } else {
            // 权限已拒绝,在此处执行逻辑
        }
    }

requestPermissionLauncher.launch(Manifest.permission.CAMERA)
总结

可以看出,使用 registerForActivityResult 可以更加方便地处理 Activity 和 Fragment 的交互,并能简单地处理权限请求,真正实现了“写更少、做更多”的目标。当我们需要处理 Activity 或 Fragment 的交互时,记得尝试使用此 API。