Activity Result:输入输出契约 · AndroidX 源码指南
AAndroidX 源码指南
Activity
应用基础 · androidx.activity

Activity Result:输入输出契约1.14.0-alpha01

用 ActivityResultContract、launcher 和回调建立可测试的结果流。

最后更新 2026-07-31

数据流

ActivityResultContract<I, O> 描述输入 I 和输出 OregisterForActivityResult 注册回调并返回 launcher,最后由 launch(input) 发起操作。

private val pickImage = registerForActivityResult(
    ActivityResultContracts.GetContent()
) { uri ->
    // uri: Uri?
}

fun openPicker() {
    pickImage.launch("image/*")
}

这比手动维护整数 requestCode 更强:契约让类型、Intent 构造和结果解析集中在一起,ActivityResultRegistry 还能在测试中被替换。

Compose 中使用

launcher 必须在组合过程中无条件创建;点击时只调用 launch

val launcher = rememberLauncherForActivityResult(
    ActivityResultContracts.TakePicturePreview()
) { bitmap ->
    preview = bitmap
}

Button(onClick = { launcher.launch() }) {
    Text("拍照")
}

不要在 onClick 内调用 rememberLauncherForActivityResult,因为 remember API 只能处于 Composition。

常用内置契约

  • RequestPermissionString → Boolean
  • GetContent:MIME type → Uri?
  • StartActivityForResultIntent → ActivityResult
  • TakePicturePreview:无输入 → 缩略 Bitmap?