喚醒次數過多

喚醒是 AlarmManager API 的其中一種機制,可以讓開發人員設定鬧鐘,並在特定時間喚醒裝置。應用程式可以藉由在 AlarmManager 使用 RTC_WAKEUPELAPSED_REALTIME_WAKEUP 標記呼叫 set() 方法,藉此設定喚醒鬧鐘。觸發喚醒鬧鐘時,裝置會退出低電力模式,並保留部分 Wake Lock,同時執行鬧鐘的 onReceive()onAlarm() 方法。如果喚醒鬧鐘的觸發次數過多,可能就會用光裝置電池電力。

為了幫助您改善應用程式品質,Android 會自動監控應用程式是否有喚醒鬧鐘次數過多的問題,並在 Android Vitals 顯示資訊。如要瞭解資料的收集方式,請參閱 Play 管理中心文件

如果應用程式喚醒裝置的次數過多,您可以利用本頁的指南診斷並修正問題。

修正問題

我們在早期的 Android 平台版本中已推出 AlarmManager,但隨著時間過去,許多之前需要 AlarmManager 的用途現在都會改善到 WorkManager 等新功能上。本章節會說明減少喚醒鬧鐘的訣竅,不過長遠來看,還是建議您遷移應用程式,以便使用「最佳做法」章節所推薦的做法。

請找出您在應用程式的哪些位置排定了喚醒鬧鐘,然後減少這些鬧鐘觸發的頻率。以下提供幾項訣竅:

  • AlarmManager 裡尋找多種 set() 方法的呼叫,包括 RTC_WAKEUPELAPSED_REALTIME_WAKEUP 標記。

  • 建議您在鬧鐘的標記名稱中加入封包、類別或方法名稱,這樣就能輕鬆在原始碼裡找到設定鬧鐘的位置。以下提供幾項額外的訣竅:

    • 請勿在名稱裡面加入任何個人識別資訊 (PII),例如電子郵件地址。否則裝置便會記錄 _UNKNOWN,而不是鬧鐘名稱。
    • 請勿藉由程式輔助方式產生類別或方法名稱,例如藉由呼叫 getName() 產生名稱等,因為 Proguard 可能會進行模糊處理。請改用硬式編碼字串。
    • 請勿在鬧鐘標記裡加上計數器或專用 ID,因為用這種方式設定的鬧鐘都有專用 ID,會造成系統無法彙整。

修正問題後,請執行以下 ADB 指令,確認喚醒鬧鐘正常運作:

adb shell dumpsys alarm

這個指令可以提供裝置鬧鐘系統服務的狀態資訊。詳情請參閱 dumpsys

最佳做法

只有在應用程式需要執行面向使用者的操作時 (例如發布通知或傳送快訊給使用者),才使用喚醒鬧鐘。如需 AlarmManager 最佳做法清單,請參閱排程鬧鐘

請勿使用 AlarmManager 安排背景工作時程,特別是重複性質和網路背景工作。相反地,請使用具有以下優點的 WorkManager 安排背景工作時程:

  • 批次 - 整合工作並減少電池消耗量。
  • 持續 - 如果裝置重新啟動,已排定的 WorkManager 工作會在重新啟動完成後執行。
  • 條件 - 可以根據條件 (例如裝置是否在充電,或是否可以使用 Wi-Fi) 執行工作

詳情請參閱背景處理作業指南

請勿使用 AlarmManager 安排只有在應用程式執行時才有效的計時作業。換句話說,在使用者退出應用程式後,就應該取消計時作業。在這種情況下請使用 Handler 類別,這種類別比較容易使用,也更有效率。