首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android 待機狀態下 Notification 不彈出?核心原因與解決方案

     編輯:程式設計綜合問答

問題現象

App 在前台、後台運行時通知正常顯示,但裝置進入待機(螢幕熄滅、CPU 休眠)後,通知不再彈出,直到喚醒螢幕才一次性湧現。

根本原因:Doze 模式與應用待機桶

Android 6.0+ 引入 Doze 模式 及 App Standby Buckets,系統為省電會限制非高優先級應用的網路存取、AlarmManager、JobScheduler 等。若通知依賴普通 `PendingIntent` 或輪詢推送,極易在深度休眠時被延遲或丟棄。

解決方案:使用高優先級 FCM 訊息 + 前台服務

  1. 採用 Firebase Cloud Messaging (FCM) 高優先級訊息:在 payload 中設定 `"priority": "high"`,可喚醒裝置並立即送達,繞過 Doze 限制。
  2. 配合 `NotificationChannel` 設定 `IMPORTANCE_HIGH`(Android 8.0+):確保通知通道等級足夠,系統才會在鎖屏、浮動式彈出。
  3. 必要時啟動前台服務:若需長時間運行(如即時通訊、定位),在 `Service` 中呼叫 `startForeground()` 並顯示持續性通知,防止被系統殺死。
  4. 白名單豁免(僅作最後手段):引導使用者在「電池優化」中將 App 設為「不優化」,但會增加耗電,且 Google Play 政策限制濫用。

關鍵程式碼片段

// FCM 高優先級 payload 範例
{
  "to": "/topics/all",
  "priority": "high",
  "notification": {
    "title": "新訊息",
    "body": "您有一筆待處理項目",
    "channel_id": "high_importance_channel"
  }
}

測試驗證

使用 `adb shell dumpsys deviceidle force-idle` 強制進入 Doze 模式,觀察通知是否即時送達;搭配 `logcat -s FCM` 追蹤訊息接收流程。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved