fix: 移除永久WakeLock避免耗电,依赖前台服务+电池白名单保活
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -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
|
||||
// 连接 MQTT(Paho 库内部会管理自己的心跳和重连)
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user