乐趣区

关于android:使用-Jetpack-ActivityResult-处理-Activity-之间的数据通信

作者 / Yacine Rezgui

无论您是在利用中申请某项权限,从文件管理系统中抉择某个文件,还是冀望从第三方利用中获取到某些数据,都会波及到在 Activity 之间传递数据,而这也正是 Android 中过程间通信的外围要点。近期咱们公布了新的 ActivityResult API 来帮忙简化 Activity 间的数据通信。

之前,想要从启动的 Activity 中获取到返回后果,利用须要在 Activity 和 Fragment 中实现 onActivityResult() 办法,而后查看回调关联到哪一个 requestCode,并验证该 requestCode 的后果是否为 OK,最终再去验证返回数据或扩大数据。

然而这样的解决形式会让咱们的代码变得非常复杂,并且也无奈保障在 Activity 发送或接收数据时参数的类型平安。

ActivityResult API 是什么

ActivityResult API 被退出到 Jetpack 的 Activity 和 Fragment 库中,旨在通过提供类型平安的 contract (协定) 来简化解决来自 Activity 的数据。这些 协定 为一些常见操作 (比方: 拍照或申请权限) 定义了预期的输出和输入类型,除此之外您还可能 自定义协定 来满足不同场景的需要。

ActivityResult API 提供了一些组件用于注册 Activity 的处理结果、发动申请以及在零碎返回后果后立刻进行相应解决。您也能够在启动 Activity 的中央应用一个独立的类接管返回后果,这样仍然可能保障类型平安。

如何应用

接下来咱们通过一个打开文档的示例,来演示如何应用 ActivityResult API。

首先,您须要在 gradle 文件中增加以下依赖:

 repositories {google()
    maven()}
 
dependencies {
  // 在 https://developer.android.google.cn/jetpack/androidx/releases/activity 取得最新版本号
  def activity_version = "1.2.0"
  // 在 https://developer.android.google.cn/jetpack/androidx/releases/fragment 取得最新版本号
  def fragment_version = "1.3.0"
  
  implementation "androidx.activity:activity:$activity_version"
  implementation "androidx.fragment:fragment:$fragment_version”}

您须要在协定中注册一个 回调,在其中定义它输入输出的类型。

在下列代码中,GetContent() 指的是 ACTION_GET_DOCUMENT intent,它是在 Activity 库中已定义好的默认协定之一。您能够在这里找到残缺的 已定义协定列表。

val getContent = registerForActivityResult(GetContent()) { uri: Uri? ->
    // 解决返回的 Uri
}

当初咱们须要应用返回的 launcher 来启动咱们的 Activity。您能够设置一个 mime 类型的过滤器对所选文件进行过滤,GetContent.launch() 接管一个字符串作为参数:

 val getContent = registerForActivityResult(GetContent()) { uri: Uri? ->
    // 解决返回的 Uri
}
 
override fun onCreate(savedInstanceState: Bundle?) {
    // ...
 
    val selectButton = findViewById<Button>(R.id.select_button)
 
    selectButton.setOnClickListener {
        // 传入您想让用户抉择的 mime 类型作为输出
        getContent.launch("image/*")
    }
}

一旦图片被选中并返回到您的 Activity,就会携带着预期后果执行您之前注册的回调函数。正如您看到的代码片段,ActivityResult 在解决来自 Activity 的返回数据时带来了更便捷的开发体验。

当初就应用最新稳定版的 ActivityFragment 库,通过 ActivityResult API 以类型平安的形式解决您的 Intent 后果吧!

  • 查看 Activity 库的最新版本
  • 查看 Fragment 库的最新版本

咱们也心愿听到来自各位开发者的反馈,如果您有任何倡议或意见,都能够在这里给咱们 提交反馈。

退出移动版