Android startActivity 和 registerForActivityResult用法详解

267 阅读1分钟

在 Android Kotlin 开发中,startActivityregisterForActivityResult 是启动新 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() 更推荐。