共计 1877 个字符,预计需要花费 5 分钟才能阅读完成。
作者 / 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 的返回数据时带来了更便捷的开发体验。
当初就应用最新稳定版的 Activity
和 Fragment
库,通过 ActivityResult
API 以类型平安的形式解决您的 Intent 后果吧!
- 查看 Activity 库的最新版本
- 查看 Fragment 库的最新版本
咱们也心愿听到来自各位开发者的反馈,如果您有任何倡议或意见,都能够在这里给咱们 提交反馈。