0

我有两个关于在 android 中回调 registerForActivityResult 的问题。当活动将要销毁时,是否有必要取消注册此回调?或者这个回调是生命周期感知的并且在使用时是安全的?以及您使用时的另一个问题

ActivityResultContracts.StartActivityForResult()

它会给你带来结果数据。之前如何管理像 onActivityResult 这样的请求代码?假设您要使用不同的请求代码启动两个活动以获得不同的结果,依此类推。那么处理来自一项活动的不同请求代码的最佳方法是什么

registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { 结果 -> if (result.resultCode == Activity.RESULT_OK) {

} }

4

1 回答 1

0

Q1:这个activity要销毁的时候需要注销这个callback吗?

答:没有

Q2:这个回调是生命周期感知的吗?

答:是的

Q3:什么时候使用ActivityResultContracts.StartActivityForResult()?

Ans:它将在您创建自定义合同时使用,更多信息:https ://developer.android.com/training/basics/intents/result#custom

Q4:处理一个活动的不同请求代码的最佳方法是什么?

答:

示例:针对一项活动

->从第一个活动启动第二个活动:

val intent =  Intent(this, SecondActivity::class.java)
    startActivityForResult(intent,101)

-> 在第一个活动中,您必须覆盖 onActivityResult():

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

    when (requestCode) {
        101 -> {
            when (resultCode) {
                Activity.RESULT_OK -> {
                    data!!.getStringExtra("keySecond")
                }
                Activity.RESULT_CANCELED -> {
                    //if there's no result
                }
            }
        }
    }

-> 在第二个活动中将结果发送回第一个活动,如下所示:

 val intent = Intent()
    intent.putExtra("keySecond","dataFromSecondActivity")
    setResult(Activity.RESULT_OK,intent)
    finish()

示例:针对多个活动

-> 如果您处理来自一项活动的不同请求代码:

   val intent =  Intent(this, ThirdActivity::class.java)
    startActivityForResult(intent,210)

-> 在第三个活动中发回结果

 val intent = Intent()
    intent.putExtra("keyThird","dataFromThirdActivity")
    setResult(Activity.RESULT_OK,intent)
    finish()

->那么您在第一个活动中的 onActivityResult() 函数应该如下所示:

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

    when (requestCode) {
        101 -> { //result from second activity
            when (resultCode) {
                Activity.RESULT_OK -> {
                    data!!.getStringExtra("keySecond")
                }
                Activity.RESULT_CANCELED -> {
                    //if there's no result
                }
            }
        }
        210 -> { //result from third activity
            when (resultCode) {
                Activity.RESULT_OK -> {
                    data!!.getStringExtra("keyThird")
                }
                Activity.RESULT_CANCELED -> {
                    //if there's no result
                }
            }
        }

    }
}
于 2021-05-01T07:46:33.867 回答