fix: 息屏时停止电量/蓝牙/信号监听,亮屏时恢复

监听SCREEN_OFF/SCREEN_ON,息屏后注销所有广播接收器和信号监听,
亮屏后重新注册。息屏后只剩MQTT心跳,与旧版耗电一致。

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
dongliang
2026-05-11 12:11:00 +09:30
parent ccfa30daa6
commit 4de0b04cd2

View File

@@ -24,6 +24,7 @@ import javax.inject.Singleton
/**
* 系统状态监听器
* 注册 BroadcastReceiver 监听电量、蓝牙状态变化,通过 EventBus 分发事件
* 息屏时自动停止监听(省电),亮屏时恢复
*
* 使用方式:
* - MainActivity.onCreate 中调用 register()
@@ -55,7 +56,7 @@ class SystemStateMonitor @Inject constructor(
}
}
/** 广播接收器 */
/** 状态广播接收器(电量、蓝牙) */
private val receiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
when (intent.action) {
@@ -71,10 +72,56 @@ class SystemStateMonitor @Inject constructor(
}
}
/** 注册广播监听 */
/** 屏幕开关广播接收器(控制状态监听的启停) */
private val screenReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
when (intent.action) {
Intent.ACTION_SCREEN_OFF -> pauseMonitoring()
Intent.ACTION_SCREEN_ON -> resumeMonitoring()
}
}
}
/** 状态监听是否活跃 */
private var monitoring = false
/** 注册(包含屏幕开关监听 + 启动状态监听) */
fun register() {
if (registered) return
// 注册屏幕开关监听(始终活跃,不受息屏影响)
val screenFilter = IntentFilter().apply {
addAction(Intent.ACTION_SCREEN_OFF)
addAction(Intent.ACTION_SCREEN_ON)
}
context.registerReceiver(screenReceiver, screenFilter)
// 启动状态监听
resumeMonitoring()
registered = true
Timber.d("系统状态监听: 已注册")
}
/** 取消注册(清理所有监听) */
fun unregister() {
if (!registered) return
pauseMonitoring()
try {
context.unregisterReceiver(screenReceiver)
} catch (e: Exception) {
Timber.w(e, "系统状态监听: 取消屏幕监听异常")
}
registered = false
Timber.d("系统状态监听: 已取消注册")
}
/** 启动状态监听(亮屏时调用) */
private fun resumeMonitoring() {
if (monitoring) return
val filter = IntentFilter().apply {
addAction(Intent.ACTION_BATTERY_CHANGED)
addAction(BluetoothAdapter.ACTION_STATE_CHANGED)
@@ -83,29 +130,27 @@ class SystemStateMonitor @Inject constructor(
}
context.registerReceiver(receiver, filter)
// 注册信号强度监听
val telephony = context.getSystemService(Context.TELEPHONY_SERVICE) as? TelephonyManager
telephony?.listen(phoneStateListener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS)
registered = true
Timber.d("系统状态监听: 已注册")
monitoring = true
Timber.d("系统状态监听: 亮屏恢复")
}
/** 取消注册 */
fun unregister() {
if (!registered) return
/** 停止状态监听(息屏时调用) */
private fun pauseMonitoring() {
if (!monitoring) return
try {
context.unregisterReceiver(receiver)
} catch (e: Exception) {
Timber.w(e, "系统状态监听: 取消注册异常")
Timber.w(e, "系统状态监听: 停止监听异常")
}
// 取消信号监听
val telephony = context.getSystemService(Context.TELEPHONY_SERVICE) as? TelephonyManager
telephony?.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE)
registered = false
Timber.d("系统状态监听: 已取消注册")
monitoring = false
Timber.d("系统状态监听: 息屏暂停")
}
/** 上次电量百分比(去抖用) */