fix: 息屏后MQTT断连导致无法收到通知

添加前台服务+WakeLock保活MQTT连接,请求电池优化白名单绕过Doze限制,
AlarmManager每5分钟健康检查断连自动重连。

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
dongliang
2026-05-09 13:10:04 +09:30
parent 966c9f9c0d
commit b867c33015
6 changed files with 301 additions and 5 deletions

View File

@@ -1,7 +1,12 @@
package com.xiaoqu.watch.app
import android.content.Intent
import android.content.pm.ActivityInfo
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.os.PowerManager
import android.provider.Settings
import android.view.MotionEvent
import android.view.View
import androidx.activity.OnBackPressedCallback
@@ -92,6 +97,9 @@ class MainActivity : AppCompatActivity() {
// 监听 MQTT type=1 → 处理通知 + 显示横幅
observeMqttMessages()
// 请求电池优化白名单(绕过 Doze 模式限制)
requestBatteryWhitelist()
Timber.d("MainActivity created")
}
@@ -211,6 +219,31 @@ class MainActivity : AppCompatActivity() {
}
}
// ===== 电池优化白名单 =====
/**
* 请求加入电池优化白名单Doze 模式下允许后台网络访问)
* 已在白名单中则跳过,避免重复弹窗
*/
private fun requestBatteryWhitelist() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
val pm = getSystemService(PowerManager::class.java)
if (!pm.isIgnoringBatteryOptimizations(packageName)) {
try {
val intent = Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS).apply {
data = Uri.parse("package:$packageName")
}
startActivity(intent)
Timber.d("电池白名单: 已请求")
} catch (e: Exception) {
Timber.w(e, "电池白名单: 请求失败")
}
} else {
Timber.d("电池白名单: 已在白名单中")
}
}
}
// ===== OTA 更新 =====
/** 设置更新弹窗按钮回调 */