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

如何在不使用Intent且不重启原Activity的情况下传递Activity间数据?

解决方案:无需重启Activity的数据回传

嗨,这个需求其实有好几种成熟的实现方式,完全不用重新启动第一个Activity,我给你列几个最常用的方案:

1. 推荐:使用Activity Result API(替代已弃用的startActivityForResult)

这是Android官方推荐的方式,专门用来处理Activity之间的结果回传,不会导致第一个Activity重启。

第一步:在第一个Activity中注册结果回调

class FirstActivity : AppCompatActivity() {
    // 注册结果回调,指定接收int类型的结果
    private val getPositionResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
        if (result.resultCode == RESULT_OK) {
            val position = result.data?.getIntExtra("selected_position", -1)
            // 这里处理拿到的position,比如更新UI或者业务逻辑
            position?.let {
                Log.d("FirstActivity", "收到选中的position: $it")
            }
        }
    }

    // 启动第二个Activity的方法
    private fun startSecondActivity() {
        val intent = Intent(this, SecondActivity::class.java)
        getPositionResult.launch(intent)
    }
}

第二步:在第二个Activity中回传数据并结束

class SecondActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_second)

        val listView = findViewById<ListView>(R.id.list_view)
        // 假设你已经给ListView设置了适配器
        listView.onItemClickListener = AdapterView.OnItemClickListener { _, _, position, _ ->
            // 准备回传的数据
            val resultIntent = Intent()
            resultIntent.putExtra("selected_position", position)
            // 设置结果并结束当前Activity
            setResult(RESULT_OK, resultIntent)
            finish()
        }
    }
}

这种方式下,第一个Activity的回调会在第二个Activity结束后触发,完全不会重启第一个Activity,非常安全可靠。

2. 使用全局单例类存储共享数据

如果不想用官方的Result API,也可以用一个单例类来临时存储数据,然后在第一个Activity回到前台时读取。

第一步:创建单例类

object DataHolder {
    var selectedPosition: Int = -1
}

第二步:第二个Activity中存储数据

listView.onItemClickListener = AdapterView.OnItemClickListener { _, _, position, _ ->
    DataHolder.selectedPosition = position
    finish()
}

第三步:第一个Activity中读取数据

因为第二个Activity结束后,第一个Activity会触发onResume方法,所以在这里读取:

override fun onResume() {
    super.onResume()
    val position = DataHolder.selectedPosition
    if (position != -1) {
        // 处理数据
        Log.d("FirstActivity", "收到选中的position: $position")
        // 记得用完重置,避免下次误读
        DataHolder.selectedPosition = -1
    }
}

这种方式简单直接,但要注意数据的重置,避免重复处理旧数据。

3. 使用共享ViewModel(Jetpack组件)

如果你项目中已经用了Android Jetpack,用共享ViewModel是更优雅的方式,它可以在不同组件间共享数据,且不会导致内存泄漏。

第一步:创建共享ViewModel

class SharedViewModel(application: Application) : AndroidViewModel(application) {
    val selectedPosition = MutableLiveData<Int>()
}

第二步:第一个Activity中观察数据

class FirstActivity : AppCompatActivity() {
    private lateinit var viewModel: SharedViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_first)
        
        // 以Application为Owner获取ViewModel,确保和第二个Activity拿到同一个实例
        viewModel = ViewModelProvider.AndroidViewModelFactory(application).create(SharedViewModel::class.java)
        
        // 观察position的变化
        viewModel.selectedPosition.observe(this) { position ->
            // 处理数据
            Log.d("FirstActivity", "收到选中的position: $position")
        }
    }
}

第三步:第二个Activity中更新数据

class SecondActivity : AppCompatActivity() {
    private lateinit var viewModel: SharedViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_second)
        
        viewModel = ViewModelProvider.AndroidViewModelFactory(application).create(SharedViewModel::class.java)
        
        val listView = findViewById<ListView>(R.id.list_view)
        listView.onItemClickListener = AdapterView.OnItemClickListener { _, _, position, _ ->
            viewModel.selectedPosition.value = position
            finish()
        }
    }
}

这种方式的好处是数据响应式,不用手动在onResume里判断,而且ViewModel会自动管理生命周期,避免内存泄漏。

总结

  • 如果是简单的结果回传,优先用Activity Result API,官方推荐,最规范;
  • 如果你项目还没接入Jetpack,用全局单例最快捷;
  • 要是已经在用Jetpack,共享ViewModel是最优雅的选择。

内容的提问来源于stack exchange,提问作者JcodingW

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:06:58