建议使用ActivityResultRegistry
ComponentActivity现在提供了一个ActivityResultRegistry,使您能够处理startActivityForResult()+ onActivityResult()以及requestPermissions()+ onRequestPermissionsResult()流,而无需在Activityor中覆盖方法,Fragment通过带来更高的类型安全性ActivityResultContract,并提供用于测试这些流的钩子。  
强烈建议使用AndroidX活动1.2.0-alpha02和片段1.3.0-alpha02中引入的活动结果API。
将此添加到您的 build.gradle
def activity_version = "1.2.0-alpha03"
// Java language implementation
implementation "androidx.activity:activity:$activity_version"
// Kotlin
implementation "androidx.activity:activity-ktx:$activity_version"
如何使用预建合同?
这个新的API具有以下预先构建的功能
- 拍摄视频
- 选择联系
- 获取内容
- 获取内容 
- 打开文件 
- OpenDocuments 
- OpenDocumentTree 
- 创建文档
- 拨号
- 拍照片
- 请求权限
- 请求权限
使用takePicture合同的示例:
private val takePicture = prepareCall(ActivityResultContracts.TakePicture()) 
     { bitmap: Bitmap? ->
        // Do something with the Bitmap, if present
    }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        button.setOnClickListener { takePicture() }
       }
那么这是怎么回事?让我们将其分解一下。takePicture只是一个返回可为空的位图的回调-是否为空取决于该onActivityResult过程是否成功。prepareCall然后将此调用注册到ComponentActivity名为的新功能中ActivityResultRegistry-我们稍后会再介绍。ActivityResultContracts.TakePicture()是Google为我们创建的内置帮助程序之一,最终调用takePicture实际上会以您以前使用的相同方式触发Intent Activity.startActivityForResult(intent, REQUEST_CODE)。
如何编写自定义合同?
以Int作为输入并返回请求活动的String的简单协定将在结果Intent中返回。
    class MyContract : ActivityResultContract<Int, String>() {
    companion object {
        const val ACTION = "com.myapp.action.MY_ACTION"
        const val INPUT_INT = "input_int"
        const val OUTPUT_STRING = "output_string"
    }
    override fun createIntent(input: Int): Intent {
        return Intent(ACTION)
            .apply { putExtra(INPUT_INT, input) }
    }
    override fun parseResult(resultCode: Int, intent: Intent?): String? {
        return when (resultCode) {
            Activity.RESULT_OK -> intent?.getStringExtra(OUTPUT_STRING)
            else -> null
        }
    }
}
    class MyActivity : AppCompatActivity() {
    private val myActionCall = prepareCall(MyContract()) { result ->
        Log.i("MyActivity", "Obtained result: $result")
    }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        ...
        button.setOnClickListener {
            myActionCall(500)
        }
    }
}
查看此官方文档以获取更多信息。