fix: 降低耗电 - 时钟改每分钟更新+息屏暂停,健康检查改15分钟+不唤醒

1. 时钟从每秒更新改为每分钟,用 repeatOnLifecycle 息屏自动暂停
2. MQTT 健康检查从5分钟改为15分钟,用 ELAPSED_REALTIME 不强制唤醒设备

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
dongliang
2026-05-09 21:45:31 +09:30
parent ee33cf7ca1
commit 4071d9733e
2 changed files with 16 additions and 23 deletions

View File

@@ -5,7 +5,6 @@ import android.app.PendingIntent
import android.content.BroadcastReceiver import android.content.BroadcastReceiver
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.os.Build
import android.os.SystemClock import android.os.SystemClock
import com.xiaoqu.watch.service.manager.MqttManager import com.xiaoqu.watch.service.manager.MqttManager
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
@@ -15,16 +14,16 @@ import javax.inject.Inject
/** /**
* MQTT 连接健康检查广播接收器 * MQTT 连接健康检查广播接收器
* *
* 通过 AlarmManager.setExactAndAllowWhileIdle() 定期触发, * 通过 AlarmManager 定期触发(不强制唤醒,等系统维护窗口)
* 在 Doze 模式的维护窗口中检查 MQTT 连接状态,断连则重连。 * 检查 MQTT 连接状态,断连则重连。
* 同时确保 MqttService 前台服务存活。 * 同时确保 MqttService 前台服务存活。
*/ */
@AndroidEntryPoint @AndroidEntryPoint
class MqttAlarmReceiver : BroadcastReceiver() { class MqttAlarmReceiver : BroadcastReceiver() {
companion object { companion object {
/** 检查间隔5 分钟(Doze 维护窗口至少 10 分钟5 分钟能抓到窗口期 */ /** 检查间隔:15 分钟(减少唤醒频率,前台服务+电池白名单已足够保活 */
private const val CHECK_INTERVAL_MS = 5 * 60 * 1000L private const val CHECK_INTERVAL_MS = 15 * 60 * 1000L
/** 启动定时健康检查 */ /** 启动定时健康检查 */
fun schedule(context: Context) { fun schedule(context: Context) {
@@ -35,20 +34,12 @@ class MqttAlarmReceiver : BroadcastReceiver() {
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
) )
// setExactAndAllowWhileIdle: Doze 模式下也能触发 // 不唤醒设备,等系统下次维护窗口时执行(省电)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { alarmManager.set(
alarmManager.setExactAndAllowWhileIdle( AlarmManager.ELAPSED_REALTIME, // 不强制唤醒
AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime() + CHECK_INTERVAL_MS, SystemClock.elapsedRealtime() + CHECK_INTERVAL_MS,
pendingIntent pendingIntent
) )
} else {
alarmManager.setExact(
AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime() + CHECK_INTERVAL_MS,
pendingIntent
)
}
Timber.d("MqttAlarm: 已设置 ${CHECK_INTERVAL_MS / 1000}s 后检查") Timber.d("MqttAlarm: 已设置 ${CHECK_INTERVAL_MS / 1000}s 后检查")
} }

View File

@@ -378,12 +378,14 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
} }
} }
/** 每更新时钟 */ /** 每分钟更新时钟(息屏时自动暂停,省电) */
private fun startClockUpdater() { private fun startClockUpdater() {
viewLifecycleOwner.lifecycleScope.launch { viewLifecycleOwner.lifecycleScope.launch {
viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
while (isActive) { while (isActive) {
updateClock() updateClock()
delay(1000) delay(60_000)
}
} }
} }
} }