fix: 移除永久WakeLock避免耗电,依赖前台服务+电池白名单保活

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
dongliang
2026-05-09 13:11:56 +09:30
parent b867c33015
commit 583ce9b841

View File

@@ -8,7 +8,6 @@ import android.content.Context
import android.content.Intent
import android.os.Build
import android.os.IBinder
import android.os.PowerManager
import com.xiaoqu.watch.R
import com.xiaoqu.watch.service.manager.MqttManager
import dagger.hilt.android.AndroidEntryPoint
@@ -20,7 +19,11 @@ import javax.inject.Inject
*
* 保持 MQTT 连接在息屏/Doze 模式下不被系统杀死。
* 通过 startForegroundService() 启动,显示常驻通知。
* 持有 PARTIAL_WAKE_LOCK 防止 CPU 休眠断连。
* 持有永久 WakeLock省电依赖
* - 前台服务:防止进程被杀
* - 电池白名单:绕过 Doze 网络限制
* - Paho 库内置心跳机制:自动维护连接
* - AlarmManager 健康检查:兜底重连
*/
@AndroidEntryPoint
class MqttService : Service() {
@@ -49,9 +52,6 @@ class MqttService : Service() {
@Inject lateinit var mqttManager: MqttManager
/** 保持 CPU 唤醒,防止息屏后 MQTT 心跳丢失 */
private var wakeLock: PowerManager.WakeLock? = null
override fun onCreate() {
super.onCreate()
Timber.d("MqttService: onCreate")
@@ -62,10 +62,7 @@ class MqttService : Service() {
// 启动前台服务(必须在 5 秒内调用,否则 ANR
startForeground(NOTIFICATION_ID, buildNotification())
// 获取 PARTIAL_WAKE_LOCK 保持 CPU 运行
acquireWakeLock()
// 连接 MQTT
// 连接 MQTTPaho 库内部会管理自己的心跳和重连)
mqttManager.connect()
}
@@ -82,7 +79,6 @@ class MqttService : Service() {
override fun onDestroy() {
super.onDestroy()
Timber.d("MqttService: onDestroy")
releaseWakeLock()
mqttManager.disconnect()
}
@@ -120,26 +116,4 @@ class MqttService : Service() {
.build()
}
/** 获取 WakeLock 保持 CPU 唤醒 */
private fun acquireWakeLock() {
val pm = getSystemService(Context.POWER_SERVICE) as PowerManager
wakeLock = pm.newWakeLock(
PowerManager.PARTIAL_WAKE_LOCK,
"xqwatch:mqtt_service"
).apply {
acquire() // 持续持有,直到服务销毁时释放
}
Timber.d("MqttService: WakeLock acquired")
}
/** 释放 WakeLock */
private fun releaseWakeLock() {
wakeLock?.let {
if (it.isHeld) {
it.release()
Timber.d("MqttService: WakeLock released")
}
}
wakeLock = null
}
}