OnActivityResult()
方法在 AndroidX 中已经被弃用,取而代之的是 registerForActivityResult()
方法。这个变化是为了简化 Activity 和 Fragment 之间的交互,并提高代码的可读性和可维护性。
OnActivityResult()
是一个回调方法,用于处理从启动的 Activity 返回的结果。当从一个 Activity 启动另一个 Activity 并期望在该 Activity 完成后返回结果时,可以使用 OnActivityResult()
来接收这些结果。
registerForActivityResult()
是生命周期感知的,这意味着它会在正确的时机自动处理结果,而不需要手动管理生命周期。registerForActivityResult()
可以减少样板代码,使代码更加简洁和易于理解。registerForActivityResult()
提供了更好的类型安全性。registerForActivityResult()
返回一个 ActivityResultContract
对象,该对象定义了如何启动 Activity 并处理结果。常见的 ActivityResultContract
包括:
ActivityResultContracts.StartActivityForResult
:用于一般的 Activity 结果。ActivityResultContracts.TakePicturePreview
:用于拍照并预览图片。ActivityResultContracts.TakePicture
:用于拍照并保存图片。ActivityResultContracts.PickContact
:用于选择联系人。以下是一个使用 registerForActivityResult()
的示例:
class MainActivity : AppCompatActivity() {
private val requestPermissionLauncher =
registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted: Boolean ->
if (isGranted) {
// Permission is granted. Continue the action or workflow in your app.
} else {
// Explain to the user that the feature is unavailable because the
// features requires a permission that the user has denied.
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val requestPermissionButton = findViewById<Button>(R.id.request_permission_button)
requestPermissionButton.setOnClickListener {
// Request camera permission
requestPermissionLauncher.launch(Manifest.permission.CAMERA)
}
}
}
问题:为什么 OnActivityResult()
被弃用?
原因:OnActivityResult()
存在一些问题,例如它不是生命周期感知的,容易导致内存泄漏和崩溃。此外,它的使用方式较为繁琐,需要手动管理请求码和处理结果。
解决方法:迁移到 registerForActivityResult()
。以下是迁移步骤:
OnActivityResult()
方法:从你的 Activity 或 Fragment 中移除 OnActivityResult()
方法。registerForActivityResult()
注册一个新的结果回调。例如,将以下旧的 OnActivityResult()
代码迁移到新的方式:
// 旧的 OnActivityResult() 方法
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == REQUEST_CODE && resultCode == Activity.RESULT_OK) {
val resultData = data?.getStringExtra("result_key")
// 处理结果
}
}
迁移到新的方式:
// 新的 registerForActivityResult() 方法
private val resultLauncher =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if (result.resultCode == Activity.RESULT_OK) {
val data: Intent? = result.data
val resultData = data?.getStringExtra("result_key")
// 处理结果
}
}
// 启动 Activity 并获取结果
fun startAnotherActivityForResult() {
val intent = Intent(this, AnotherActivity::class.java)
resultLauncher.launch(intent)
}
通过这种方式,你可以更简洁、更安全地处理 Activity 结果。
领取专属 10元无门槛券
手把手带您无忧上云