fix: 信号改为Toast提示有/无信号,电量广播加去抖,减少无效事件
1. 信号监听:不再实时更新状态栏,只在有/无信号翻转时Toast提示 2. 电量广播:百分比和充电状态没变就不发事件(原来每秒都触发) 3. 状态栏:移除信号条绘制 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -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))
|
||||
}
|
||||
|
||||
|
||||
@@ -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 可能为 null(API 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 -> {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
/** 更新电池状态 */
|
||||
|
||||
Reference in New Issue
Block a user