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