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

多Activity间跳转并展示更新信息的实现及finish()使用咨询

嘿,这个场景我经常碰到,给你两个实用的解决方案,再聊聊finish()的正确用法:

方案一:使用Activity Result API(推荐)

这是官方现在主推的方式,替代了旧的startActivityForResult,用来在Activity之间传递返回数据非常方便:

步骤1:在Activity1中注册结果接收器

先在Activity1里注册一个ActivityResultLauncher,用来接收Activity2返回的更新数据:

// Activity1 中的代码
private val updateInfoLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
    // 检查返回结果是否成功
    if (result.resultCode == RESULT_OK) {
        // 获取Activity2传回的更新后信息
        val updatedData = result.data?.getStringExtra("UPDATED_INFO")
        // 直接更新Activity1的UI,展示新内容
        yourInfoTextView.text = updatedData
    }
}

// 打开Activity2表单的方法
fun openUpdateForm() {
    val intent = Intent(this, Activity2::class.java)
    // 如果需要把当前信息传给Activity2做预填充,就加这行
    intent.putExtra("CURRENT_INFO", yourInfoTextView.text.toString())
    // 启动Activity2
    updateInfoLauncher.launch(intent)
}

步骤2:在Activity2中返回更新数据

当用户填完表单提交时,把更新后的信息打包返回给Activity1,然后关闭自己:

// Activity2 提交按钮的点击事件处理
fun onSubmitButtonClicked() {
    // 获取表单里的新信息
    val updatedInfo = infoEditText.text.toString()
    // 准备返回的Intent
    val resultIntent = Intent()
    resultIntent.putExtra("UPDATED_INFO", updatedInfo)
    // 设置返回结果
    setResult(RESULT_OK, resultIntent)
    // 关闭Activity2,回到Activity1
    finish()
}
方案二:使用ViewModel共享数据(适合复杂场景)

如果你的页面逻辑比较复杂,或者需要在多个组件间共享数据,用ViewModel+LiveData会更灵活,不用手动传递Intent数据:

步骤1:创建共享ViewModel

先定义一个ViewModel类,用来存放需要共享的信息:

class SharedInfoViewModel : ViewModel() {
    // 用MutableLiveData来观察数据变化
    val updatedInfo = MutableLiveData<String>()
}

步骤2:Activity1中观察数据变化

在Activity1里监听ViewModel的数据,一旦有更新就自动刷新UI:

// Activity1 中的代码
val sharedViewModel = ViewModelProvider(this).get(SharedInfoViewModel::class.java)
// 观察数据变化
sharedViewModel.updatedInfo.observe(this) { newInfo ->
    // 自动更新UI
    yourInfoTextView.text = newInfo
}

// 打开Activity2的方法
fun openUpdateForm() {
    val intent = Intent(this, Activity2::class.java)
    startActivity(intent)
}

步骤3:Activity2中更新数据

在Activity2里拿到同一个ViewModel实例,更新数据后关闭自己:

// Activity2 中的代码
val sharedViewModel = ViewModelProvider(this).get(SharedInfoViewModel::class.java)

// 提交按钮点击事件
fun onSubmitButtonClicked() {
    val updatedInfo = infoEditText.text.toString()
    // 更新ViewModel里的数据,Activity1会自动收到通知
    sharedViewModel.updatedInfo.value = updatedInfo
    // 关闭Activity2
    finish()
}
关于finish()的使用问题

这个得分情况说:

  • 从Activity1跳转到Activity2时:绝对不要调用finish()!如果你调用了,Activity1会被销毁,等你从Activity2返回时,就回不到原来的Activity1了,直接回到桌面或者上一个页面。
  • 从Activity2返回Activity1时:提交完数据后调用finish()是正确的做法,这样Activity2会被销毁,任务栈里只保留Activity1,用户返回时体验更顺畅,也不会占用多余的内存。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:53:47