Android 如何用ActivityResultLauncher替换startActivityForResult,但仍然包括选项包?

Android 如何用ActivityResultLauncher替换startActivityForResult,但仍然包括选项包?,android,onactivityresult,Android,Onactivityresult,startActivityForResult(intent:intent!,options:Bundle?已被弃用。我正试图替换为ActivityResultLauncher,但我需要传递选项。我怎样才能用新方法做到这一点?下面是一个原始(现已弃用)方法的示例,该方法将打开“联系人”菜单,然后根据code的值在开关中执行以下两项操作之一: ... val code = contactType //can be either 1 or 2 val contactsIntent = Intent(I

startActivityForResult(intent:intent!,options:Bundle?
已被弃用。我正试图替换为
ActivityResultLauncher
,但我需要传递
选项。我怎样才能用新方法做到这一点?下面是一个原始(现已弃用)方法的示例,该方法将打开“联系人”菜单,然后根据
code
的值在开关中执行以下两项操作之一:

...
val code = contactType //can be either 1 or 2
val contactsIntent = Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI)
contactsIntent.type = ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE
startActivityForResult(contactsIntent, code)

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    if(resultCode == Activity.RESULT_OK) {
        when(requestCode) {
            1 -> { //Do something
            }
            2 -> { //Do something else
            }
        }
    }
}
我曾尝试将上述内容转换为使用
ActivityResultLauncher
,但我还没有弄清楚如何将
code
的值传递给它。以下是我目前的情况:

val code = contactType //can be either 1 or 2
val contactsIntent = Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI)
contactsIntent.type = ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE
contactLauncher.launch(contactsIntent) //or maybe contactLauncher.launch(contactsIntent, code)?

private val contactLauncher: ActivityResultLauncher<Intent> = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
    if(it.resultCode == Activity.RESULT_OK) {
        when(??? requestCode ???) {
            1 -> { //Do something
            }
            2 -> { //Do something else
            }
        }
    }
}
val code=contactType//可以是1或2
val contactsInt=Intent(Intent.ACTION\u PICK,Contacts contract.Contacts.CONTENT\u URI)
ContactsInt.type=ContactsContract.CommonDataTypes.Phone.CONTENT\u类型
contactLauncher.launch(contactsInt)//或者contactLauncher.launch(contactsInt,代码)?
私有val contactLauncher:ActivityResultLauncher=registerForActivityResult(ActivityResultContracts.StartActivityForResult()){
if(it.resultCode==Activity.RESULT\u确定){
何时(?请求代码??){
1->{//做点什么
}
2->{//做点别的
}
}
}
}

在这种情况下,您需要创建两个单独的ActivityResultLauncher对象,每种情况一个

在我看来,这正是谷歌试图解决的问题,它有一个杂乱无章的“onActivityResult”函数,还必须处理请求代码。现在,这更类似于OnClickListener类型的回调


他们对Android的其他部分也做了同样的事情,比如请求应用程序权限。请求代码现在由内部处理。

我认为我们的想法是使用两个独立的
ActivityResultLauncher
对象,每个场景一个。在您需要一个int,现在是3个对象之前,它们到底在做什么?我称之为过度工程,IMHO。我称之为关注点分离,但我想这取决于你如何使用它们。