fix: 修根因——EventBus加buffer防事件丢失+恢复正确架构

根因:SharedFlow(replay=0,extraBufferCapacity=0)导致emit挂起,
多个collector竞争时事件丢失。之前的补丁越改越乱。

修复:
1. EventBus: extraBufferCapacity=64,emit不再阻塞
2. 恢复正确架构:
   - MainActivity: 监听MQTT type=1→NotificationManager→横幅
   - NotificationManager: 处理后emit NewTaskArrived
   - HomeFragment: 监听NewTaskArrived→红点+统计
3. StatusBarView: 电池位置恢复原位,默认电量-1,主动查询系统电量

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
dongliang
2026-04-29 19:23:01 +09:30
parent 329ddc505e
commit 93a31e76a3
5 changed files with 81 additions and 54 deletions

View File

@@ -7,9 +7,16 @@ import android.view.View
import androidx.activity.OnBackPressedCallback
import androidx.appcompat.app.AppCompatActivity
import com.xiaoqu.watch.databinding.ActivityMainBinding
import com.xiaoqu.watch.event.AppEvent
import com.xiaoqu.watch.event.EventBus
import com.xiaoqu.watch.service.manager.NotificationManager
import com.xiaoqu.watch.service.manager.SystemStateMonitor
import com.xiaoqu.watch.ui.widget.NotificationBannerView
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.launch
import timber.log.Timber
import javax.inject.Inject
import kotlin.math.abs
@@ -25,8 +32,10 @@ class MainActivity : AppCompatActivity() {
/** 系统状态监听器(电量、蓝牙状态) */
@Inject lateinit var systemStateMonitor: SystemStateMonitor
/** 通知横幅HomeFragment 需访问) */
@Inject lateinit var notificationManager: NotificationManager
@Inject lateinit var eventBus: EventBus
lateinit var notificationBanner: NotificationBannerView
private val activityScope = CoroutineScope(Dispatchers.Main + SupervisorJob())
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@@ -53,6 +62,9 @@ class MainActivity : AppCompatActivity() {
// 初始化通知横幅
notificationBanner = binding.notificationBanner
// 监听 MQTT type=1 → 处理通知 + 显示横幅
observeMqttMessages()
Timber.d("MainActivity created")
}
@@ -62,11 +74,21 @@ class MainActivity : AppCompatActivity() {
notificationBanner.destroy()
}
// ===== 通知横幅(由 HomeFragment 调用显示) =====
// ===== MQTT 新任务处理 =====
/** 显示通知横幅(供 HomeFragment 调用) */
fun showNotificationBanner(count: Int) {
notificationBanner.show(count)
/** 监听 MQTT type=1 → 通知管理器处理 → 横幅 + NewTaskArrived 事件 */
private fun observeMqttMessages() {
activityScope.launch {
eventBus.events.collect { event ->
if (event is AppEvent.MqttMessageReceived && event.type == 1) {
notificationManager.onNewTaskMessage(event.rawJson)
val count = notificationManager.pendingCount
if (count > 0) {
notificationBanner.show(count)
}
}
}
}
}
// ===== 下拉手势检测Activity 级别,不可能被子 View 拦截) =====