在 Android Kotlin 开发中,startActivity 和 registerForActivityResult 是启动新 Activity 并处理返回结果的两种方式。
1. 使用 startActivity
startActivity 适用于 不需要获取返回值 的情况,例如从 MainActivity 跳转到 SecondActivity:
示例:启动新 Activity
val intent = Intent(this, SecondActivity::class.java)
startActivity(intent)
如果你需要传递数据:
val intent = Intent(this, SecondActivity::class.java).apply {
putExtra("key", "Hello, SecondActivity!")
}
startActivity(intent)
在 SecondActivity 中获取:
val data = intent.getStringExtra("key")
2. 使用 registerForActivityResult
registerForActivityResult 适用于 需要从子 Activity 返回数据 的情况,比如用户选择了一个文件或拍照后返回图片。
示例:启动 Activity 并获取返回值
先在主 Activity 中注册一个 ActivityResultLauncher:
private val launcher=registerForActivityResult(ActivityResultContracts.StartActivityForResult()){ result ->
if (result.resultCode == Activity.RESULT_OK) {
val data = result.data?.getStringExtra("result_key")
Toast.makeText(this, "收到返回值: $data", Toast.LENGTH_SHORT).show()
}
}
然后使用 launcher.launch(intent) 启动新 Activity:
val intent = Intent(this, SecondActivity::class.java)
launcher.launch(intent)
在 SecondActivity 处理返回数据
val resultIntent = Intent().apply {
putExtra("result_key", "返回的数据")
}
setResult(Activity.RESULT_OK, resultIntent)
finish()
3. startActivityForResult 已废弃
startActivityForResult 在 API 30(Android 11)开始被 弃用,官方推荐使用 registerForActivityResult 代替。
如果你的代码仍然使用:
startActivityForResult(intent, REQUEST_CODE)
则应改用 registerForActivityResult。
4. 其他 ActivityResultContracts
registerForActivityResult 还支持多种 ActivityResultContracts,如:
ActivityResultContracts.RequestPermission()(请求单个权限)ActivityResultContracts.GetContent()(选择文件)ActivityResultContracts.TakePicture()(拍照)
示例:获取图片
private val getImage = registerForActivityResult(ActivityResultContracts.GetContent()) { uri: Uri? ->
uri?.let {
imageView.setImageURI(it)
}
}
button.setOnClickListener {
getImage.launch("image/*")
}
总结:
startActivity()适用于无返回值的跳转。registerForActivityResult()适用于需要获取返回值的情况,并且比startActivityForResult()更推荐。