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