Android中startActivityForResult已废弃,跨Activity传数据的替代方案是什么?
startActivityForResult废弃替代方案及ActivityResultLauncher使用指南
方案说明
从AndroidX Activity 1.2.0、Fragment 1.3.0版本开始,官方正式废弃startActivityForResult()方法,统一推荐使用Activity Result API作为跨页面数据传递的替代方案,其核心实现类就是你提到的ActivityResultLauncher,相比旧API,它解决了请求码冲突、类型不安全、代码耦合度高的问题。
跨Activity数据传递操作步骤
- 第一步:在Activity/Fragment中提前注册
ActivityResultLauncher,注册操作必须在页面生命周期到达onStart之前完成,通常可以直接作为类成员变量初始化:
// Kotlin 示例:注册启动器,接收第二个页面返回的结果 private val dataTransferLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> // 对返回结果做校验 if (result.resultCode == Activity.RESULT_OK) { // 取出第二页返回的数据,根据实际类型调整取值方法 val returnData = result.data?.getStringExtra("return_key") // 此处写接收数据后的业务逻辑 } }
- 第二步:跳转第二个Activity时,调用已注册的launcher实例发起请求,替代原有的
startActivityForResult调用:
// 跳转逻辑,可通过intent携带需要传递给第二页的数据 val intent = Intent(this@FirstActivity, SecondActivity::class.java).apply { putExtra("send_key", "传递给第二页的内容") } dataTransferLauncher.launch(intent)
- 第三步:第二个Activity返回数据的逻辑和旧API完全一致,无需修改:
// SecondActivity 中构造返回数据并关闭页面 val returnIntent = Intent() returnIntent.putExtra("return_key", "返回给第一页的内容") setResult(Activity.RESULT_OK, returnIntent) finish()
扩展用法
官方预设了多个常用场景的契约,无需手动构造Intent和解析结果,可直接使用:
- 申请单个动态权限:使用
ActivityResultContracts.RequestPermission() - 调用系统相机拍照:使用
ActivityResultContracts.TakePicture() - 选取系统文件:使用
ActivityResultContracts.GetContent()
注意:禁止在点击事件、异步回调等运行时逻辑中执行
registerForActivityResult注册操作,否则会抛出运行时异常。
内容的提问来源于stack exchange,提问作者devil-Dot
相关产品推荐
相关产品推荐

