首页 > 解决方案 > 如何用活动结果 API 替换 startActivityForResult?

问题描述

我有一个主要活动作为调用不同活动的入口点,具体取决于条件。其中,我使用 Firebase Auth 来管理用户登录:

startActivityForResult(
            AuthUI.getInstance().createSignInIntentBuilder()
                    .setAvailableProviders(providers)
                    .build(),
            RC_SIGN_IN)

我覆盖onActivityResult()以区分返回的意图/数据,例如:

 override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    when (requestCode) {

        REQUEST_CODE_1 -> {
          // update UI and stuff
        }

        RC_SIGN_IN -> {
          // check Firebase log in
        }
        // ...
    }
}

使用文档强烈推荐的活动结果 API ,我知道我应该在启动prepareCall()之前ActivityResultLauncher确保活动处于创建状态,但我仍然不明白如何优雅地处理多个活动结果(在至少,在一个地方)就像 in onActivityResult()

这篇文章,似乎我需要实现多个类型的子内部类ActivityResultContract(因此是多个prepareCall()?),因为它们被认为是不同的合同,对吗?有人可以给我看一些反映上述onActivityResult()逻辑的骨架示例吗?

标签: androidandroid-activityandroidxonactivityresult

解决方案


您可以根据需要为结果调用任意数量的活动,并为每个活动单独回调:

    val startForResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult())
    { result: ActivityResult ->
        if (result.resultCode == Activity.RESULT_OK) {
            //  you will get result here in result.data
            }

        }
    }

    startForResult.launch(Intent(activity, CameraCaptureActivity::class.java))

您只需要指定 Activity 类 -CameraCaptureActivity::class.java

更新:

The prepareCall() method has been renamed to registerForActivityResult() in Activity 1.2.0-alpha04 and Fragment 1.3.0-alpha04. And it should be startForResult.launch(...) in the last line

感谢 Rafael Tavares的更新


推荐阅读