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) { if (GlobalData.deviceRole == DeviceRole.SLAVE) {
startActivity<SlaveActivity>() startActivity<SlaveActivity>()
finish() // 延迟到下一帧 finish,避免与 LaunchActivityItem 事务竞态导致
// "Activity client record must not be null" 偶发崩溃
window.decorView.post { finish() }
return@launch return@launch
} }
// 主设备:走原有路由逻辑 // 主设备:走原有路由逻辑
@@ -110,28 +112,33 @@ class InitActivity : BaseActivity() {
startActivity<HomeActivity>() 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() * 改为 suspend 后由外层协程串行等待,保证 startActivity 早于 finish() 执行,
if (slots.isEmpty()) { * 避免内部再嵌一层 lifecycleScope.launch 导致 finish 抢跑、跳转失败
// 无调料信息,打开采样历史列表页面,点击设置配置调料信息 */
startActivity<SamplingModeActivity>() private suspend fun goSampling() {
return@launch val slots = dbViewModel.loadSeasoningSlot()
} if (slots.isEmpty()) {
val count = dbViewModel.countCookFood(cookMode = 1) // 无调料信息,打开采样历史列表页面,点击设置配置调料信息
if (count > 0) { startActivity<SamplingModeActivity>()
// 有烹饪中数据,打开采样历史列表页面 return
startActivity<SamplingModeActivity>() }
return@launch val count = dbViewModel.countCookFood(cookMode = 1)
} if (count > 0) {
// 烹饪数据,打开新增采样页面 // 烹饪数据,打开采样历史列表页面
startActivity<PrepareFoodActivity> { startActivity<SamplingModeActivity>()
putExtra(PrepareFoodActivity.PAGE_FROM, PrepareFoodActivity.HOME) return
} }
// 无烹饪数据,打开新增采样页面
startActivity<PrepareFoodActivity> {
putExtra(PrepareFoodActivity.PAGE_FROM, PrepareFoodActivity.HOME)
} }
} }