From 4071d9733ee250319b429cfef0bcf0e8898de1c3 Mon Sep 17 00:00:00 2001 From: dongliang Date: Sat, 9 May 2026 21:45:31 +0930 Subject: [PATCH] =?UTF-8?q?fix:=20=E9=99=8D=E4=BD=8E=E8=80=97=E7=94=B5=20-?= =?UTF-8?q?=20=E6=97=B6=E9=92=9F=E6=94=B9=E6=AF=8F=E5=88=86=E9=92=9F?= =?UTF-8?q?=E6=9B=B4=E6=96=B0+=E6=81=AF=E5=B1=8F=E6=9A=82=E5=81=9C?= =?UTF-8?q?=EF=BC=8C=E5=81=A5=E5=BA=B7=E6=A3=80=E6=9F=A5=E6=94=B915?= =?UTF-8?q?=E5=88=86=E9=92=9F+=E4=B8=8D=E5=94=A4=E9=86=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 时钟从每秒更新改为每分钟,用 repeatOnLifecycle 息屏自动暂停 2. MQTT 健康检查从5分钟改为15分钟,用 ELAPSED_REALTIME 不强制唤醒设备 Co-Authored-By: Claude Opus 4.6 (1M context) --- .../xiaoqu/watch/service/MqttAlarmReceiver.kt | 29 +++++++------------ .../com/xiaoqu/watch/ui/home/HomeFragment.kt | 10 ++++--- 2 files changed, 16 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/com/xiaoqu/watch/service/MqttAlarmReceiver.kt b/app/src/main/java/com/xiaoqu/watch/service/MqttAlarmReceiver.kt index fe5f911..d2b24f4 100644 --- a/app/src/main/java/com/xiaoqu/watch/service/MqttAlarmReceiver.kt +++ b/app/src/main/java/com/xiaoqu/watch/service/MqttAlarmReceiver.kt @@ -5,7 +5,6 @@ import android.app.PendingIntent import android.content.BroadcastReceiver import android.content.Context import android.content.Intent -import android.os.Build import android.os.SystemClock import com.xiaoqu.watch.service.manager.MqttManager import dagger.hilt.android.AndroidEntryPoint @@ -15,16 +14,16 @@ import javax.inject.Inject /** * MQTT 连接健康检查广播接收器 * - * 通过 AlarmManager.setExactAndAllowWhileIdle() 定期触发, - * 在 Doze 模式的维护窗口中检查 MQTT 连接状态,断连则重连。 + * 通过 AlarmManager 定期触发(不强制唤醒,等系统维护窗口), + * 检查 MQTT 连接状态,断连则重连。 * 同时确保 MqttService 前台服务存活。 */ @AndroidEntryPoint class MqttAlarmReceiver : BroadcastReceiver() { companion object { - /** 检查间隔:5 分钟(Doze 维护窗口至少 10 分钟,5 分钟能抓到窗口期) */ - private const val CHECK_INTERVAL_MS = 5 * 60 * 1000L + /** 检查间隔:15 分钟(减少唤醒频率,前台服务+电池白名单已足够保活) */ + private const val CHECK_INTERVAL_MS = 15 * 60 * 1000L /** 启动定时健康检查 */ fun schedule(context: Context) { @@ -35,20 +34,12 @@ class MqttAlarmReceiver : BroadcastReceiver() { PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE ) - // setExactAndAllowWhileIdle: Doze 模式下也能触发 - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - alarmManager.setExactAndAllowWhileIdle( - AlarmManager.ELAPSED_REALTIME_WAKEUP, - SystemClock.elapsedRealtime() + CHECK_INTERVAL_MS, - pendingIntent - ) - } else { - alarmManager.setExact( - AlarmManager.ELAPSED_REALTIME_WAKEUP, - SystemClock.elapsedRealtime() + CHECK_INTERVAL_MS, - pendingIntent - ) - } + // 不唤醒设备,等系统下次维护窗口时执行(省电) + alarmManager.set( + AlarmManager.ELAPSED_REALTIME, // 不强制唤醒 + SystemClock.elapsedRealtime() + CHECK_INTERVAL_MS, + pendingIntent + ) Timber.d("MqttAlarm: 已设置 ${CHECK_INTERVAL_MS / 1000}s 后检查") } diff --git a/app/src/main/java/com/xiaoqu/watch/ui/home/HomeFragment.kt b/app/src/main/java/com/xiaoqu/watch/ui/home/HomeFragment.kt index ed41dfc..c601c66 100644 --- a/app/src/main/java/com/xiaoqu/watch/ui/home/HomeFragment.kt +++ b/app/src/main/java/com/xiaoqu/watch/ui/home/HomeFragment.kt @@ -378,12 +378,14 @@ class HomeFragment : BaseFragment() { } } - /** 每秒更新时钟 */ + /** 每分钟更新时钟(息屏时自动暂停,省电) */ private fun startClockUpdater() { viewLifecycleOwner.lifecycleScope.launch { - while (isActive) { - updateClock() - delay(1000) + viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) { + while (isActive) { + updateClock() + delay(60_000) + } } } }