You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 02:06:03