返回

体验 Activity Result API,告别 onActivityResult 的局限

Android

ActivityResult API:告别 onActivityResult,开启数据交换新时代

作为 Android 开发者,我们经常需要在不同的 Activity 之间传递数据。传统的 onActivityResult() 方法虽然长期以来一直被使用,但其局限性却越来越明显。

ActivityResult API 横空出世,革新数据交换

ActivityResult API 应运而生,旨在解决 onActivityResult() 的痛点。它提供了一套现代化的 API,让数据交换变得更加灵活、强大且易于维护。

告别 onActivityResult() 的束缚

onActivityResult() 方法固然久经考验,但它也有其不足之处:

  • 缺乏灵活性,难以处理复杂的用例。
  • 容易在应用程序的不同部分引入耦合。
  • 异步处理结果时缺乏优雅性和易读性。

ActivityResult API 的优势

ActivityResult API 解决了这些问题,提供了众多优势:

  • 异步请求结果: 使用简洁明了的 API,可以异步请求结果,从而简化了代码结构。
  • 分离请求和结果处理: ActivityResult API 将请求与结果处理分离,实现了更松散的耦合,提高了应用程序的可维护性。
  • 灵活的约定时限和回调机制: ActivityResult API 提供了灵活的约定时限和回调机制,允许在应用程序中实现更高级别的并发。

如何使用 ActivityResult API

要开始使用 ActivityResult API,请按照以下步骤操作:

  1. 在 Android Gradle 插件中启用它:
android {
    ...
    buildFeatures {
        activity-result = true
    }
}
  1. 导入所需库:
implementation "androidx.activity:activity-ktx:1.3.1"
  1. 使用 registerForActivityResult()

此方法是 ActivityResult API 的核心。它允许我们注册一个 ActivityResultLauncher,用于启动新 Activity 并接收其结果:

val startForResult =
    registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
        // 处理结果
    }
  1. 启动 Activity

要启动一个 Activity 并接收其结果,只需调用 startActivityForResult():

startForResult.launch(Intent(this, SecondActivity::class.java))
  1. 处理结果

收到结果后,它将传递给我们在 registerForActivityResult() 中指定的回调。我们可以使用 result.resultCode 和 result.data 访问结果信息:

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if (requestCode == startForResult.contract.requestCode && resultCode == RESULT_OK) {
        // 处理结果
    }
}

常见用例

ActivityResult API 适用于各种用例,包括:

  • 从 Gallery 中选择图像
  • 使用相机拍照
  • 打开文件选择器
  • 启动可返回自定义结果的新 Activity

结论

ActivityResult API 是 onActivityResult() 的强大替代品,它为 Android 开发人员提供了更加灵活、强大且易于维护的数据交换方式。通过采用 ActivityResult API,我们可以创建更具可扩展性和可维护性的应用程序,从而提升用户体验。

常见问题解答

  1. ActivityResult API 比 onActivityResult() 有哪些优势?
  • 更高的灵活性,可处理复杂用例
  • 分离请求和结果处理,提高可维护性
  • 灵活的约定时限和回调机制,实现高级并发
  1. 如何启用 ActivityResult API?
  • 在 Android Gradle 插件中启用,并导入 androidx.activity:activity-ktx 库。
  1. 如何注册一个 ActivityResultLauncher?
  • 使用 registerForActivityResult() 方法,并提供一个 ActivityResultContract 来定义要启动的 Activity。
  1. 如何启动一个 Activity 并接收其结果?
  • 使用 startActivityForResult() 方法,并提供一个 Intent 来指定要启动的 Activity。
  1. 如何处理接收到的结果?
  • 在 registerForActivityResult() 中指定的回调中,我们可以访问 result.resultCode 和 result.data 来处理结果。