fix: 信号改为Toast提示有/无信号,电量广播加去抖,减少无效事件

1. 信号监听:不再实时更新状态栏,只在有/无信号翻转时Toast提示
2. 电量广播:百分比和充电状态没变就不发事件(原来每秒都触发)
3. 状态栏:移除信号条绘制

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
dongliang
2026-05-11 12:05:48 +09:30
parent 20a0389b07
commit ccfa30daa6
3 changed files with 28 additions and 23 deletions

View File

@@ -40,13 +40,18 @@ class SystemStateMonitor @Inject constructor(
/** 是否已注册 */
private var registered = false
/** 信号强度监听器 */
/** 上次信号状态true=有信号) */
private var lastHasSignal: Boolean? = null
/** 信号监听器(只关心有/无信号翻转Toast 提示用户) */
private val phoneStateListener = object : PhoneStateListener() {
@Suppress("DEPRECATION")
override fun onSignalStrengthsChanged(signalStrength: SignalStrength) {
// 将信号强度转换为 0-4 级
val level = signalStrength.level // API 23+ 返回 0-4
emitEvent(AppEvent.SignalChanged(level))
val hasSignal = signalStrength.level > 0
if (hasSignal != lastHasSignal) {
lastHasSignal = hasSignal
emitEvent(AppEvent.SignalChanged(if (hasSignal) 4 else 0))
}
}
}
@@ -103,18 +108,26 @@ class SystemStateMonitor @Inject constructor(
Timber.d("系统状态监听: 已取消注册")
}
/** 处理电量变化广播 */
/** 上次电量百分比(去抖用) */
private var lastBatteryPercent = -1
/** 上次充电状态(去抖用) */
private var lastIsCharging: Boolean? = null
/** 处理电量变化广播(去抖:电量或充电状态变化才发事件) */
private fun handleBatteryChanged(intent: Intent) {
// 电量百分比 = level / scale * 100
val level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0)
val scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, 100)
val percent = (level * 100) / scale
// 充电状态
val status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1)
val isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING
|| status == BatteryManager.BATTERY_STATUS_FULL
// 电量和充电状态都没变 → 不发事件
if (percent == lastBatteryPercent && isCharging == lastIsCharging) return
lastBatteryPercent = percent
lastIsCharging = isCharging
emitEvent(AppEvent.BatteryChanged(percent, isCharging))
}

View File

@@ -350,16 +350,6 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
val btOn = btAdapter?.isEnabled ?: false
statusBar.updateBluetooth(btOn)
// 信号强度初始值PhoneStateListener 注册后才有回调,先读一次当前值)
try {
val telephony = requireContext().getSystemService(android.content.Context.TELEPHONY_SERVICE)
as? android.telephony.TelephonyManager
val signalLevel = telephony?.signalStrength?.level ?: 0
statusBar.updateSignal(signalLevel)
} catch (e: Exception) {
// signalStrength 可能为 nullAPI 28+),静默处理
statusBar.updateSignal(0)
}
}
/** 初始化主页数据 */
@@ -597,9 +587,13 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
is AppEvent.BluetoothStateChanged -> {
statusBar.updateBluetooth(event.isOn)
}
// 信号强度变化
// 信号状态变化(仅有/无信号翻转时触发)
is AppEvent.SignalChanged -> {
statusBar.updateSignal(event.level)
if (event.level == 0) {
Toast.makeText(requireContext(), "网络信号丢失", Toast.LENGTH_SHORT).show()
} else {
Toast.makeText(requireContext(), "网络信号已恢复", Toast.LENGTH_SHORT).show()
}
}
// 蓝牙设备连接/断开 → 更新设置页
is AppEvent.BluetoothDeviceConnected -> {

View File

@@ -45,7 +45,6 @@ class StatusBarView @JvmOverloads constructor(
// ===== 左侧:蓝牙圆点 + 信号条 =====
drawBluetoothDot(canvas, 8f, centerY)
drawSignalBars(canvas, 22f, centerY)
// ===== 右侧:电池图标(固定位置)+ 电量百分比(电池左侧) =====
val batteryStartX = width - 50f
@@ -167,10 +166,9 @@ class StatusBarView @JvmOverloads constructor(
invalidate()
}
/** 更新信号强度 (0-4) */
/** 信号已改为 Toast 提示,状态栏不再显示 */
fun updateSignal(level: Int) {
signalLevel = level.coerceIn(0, 4)
invalidate()
// 不再绘制信号条,无需 invalidate
}
/** 更新电池状态 */