多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
相关产品推荐
相关产品推荐

