fix(init): 解决Activity启动时序竞态问题

- 将finish()调用延迟到下一帧执行,避免与LaunchActivityItem事务竞态
- 修复"Activity client record must not be null"偶发崩溃问题
- 将goSampling方法改为suspend函数确保协程串行执行
- 保证startActivity在finish()之前完成,防止页面跳转失败
This commit is contained in:
2026-05-18 16:05:26 +08:00
parent 28784fa7c1
commit 87ca6abe1b
@@ -93,7 +93,9 @@ class InitActivity : BaseActivity() {
// 子设备:直接进入小屏专属页面,不走原有大屏业务流程
if (GlobalData.deviceRole == DeviceRole.SLAVE) {
startActivity<SlaveActivity>()
finish()
// 延迟到下一帧 finish,避免与 LaunchActivityItem 事务竞态导致
// "Activity client record must not be null" 偶发崩溃
window.decorView.post { finish() }
return@launch
}
// 主设备:走原有路由逻辑
@@ -110,28 +112,33 @@ class InitActivity : BaseActivity() {
startActivity<HomeActivity>()
}
}
finish()
// 延迟到下一帧 finish,避免与 LaunchActivityItem 事务竞态导致
// "Activity client record must not be null" 偶发崩溃
window.decorView.post { finish() }
}
}
private fun goSampling() {
lifecycleScope.launch {
val slots = dbViewModel.loadSeasoningSlot()
if (slots.isEmpty()) {
// 无调料信息,打开采样历史列表页面,点击设置配置调料信息
startActivity<SamplingModeActivity>()
return@launch
}
val count = dbViewModel.countCookFood(cookMode = 1)
if (count > 0) {
// 有烹饪中数据,打开采样历史列表页面
startActivity<SamplingModeActivity>()
return@launch
}
// 烹饪数据,打开新增采样页面
startActivity<PrepareFoodActivity> {
putExtra(PrepareFoodActivity.PAGE_FROM, PrepareFoodActivity.HOME)
}
/**
* 采样模式启动路由:根据本地调料配置和烹饪中数据决定跳转目标
* 改为 suspend 后由外层协程串行等待,保证 startActivity 早于 finish() 执行,
* 避免内部再嵌一层 lifecycleScope.launch 导致 finish 抢跑、跳转失败
*/
private suspend fun goSampling() {
val slots = dbViewModel.loadSeasoningSlot()
if (slots.isEmpty()) {
// 无调料信息,打开采样历史列表页面,点击设置配置调料信息
startActivity<SamplingModeActivity>()
return
}
val count = dbViewModel.countCookFood(cookMode = 1)
if (count > 0) {
// 烹饪数据,打开采样历史列表页面
startActivity<SamplingModeActivity>()
return
}
// 无烹饪数据,打开新增采样页面
startActivity<PrepareFoodActivity> {
putExtra(PrepareFoodActivity.PAGE_FROM, PrepareFoodActivity.HOME)
}
}