建议使用ActivityResultRegistry
ComponentActivity
现在提供了一个ActivityResultRegistry
,使您能够处理startActivityForResult()
+ onActivityResult()
以及requestPermissions()
+ onRequestPermissionsResult()
流,而无需在Activity
or中覆盖方法,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)
}
}
}
查看此官方文档以获取更多信息。