喚醒次數過多

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

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

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

修正問題

AlarmManager 推出時,Android 平台版本較為早期,不過隨著時間過去,許多之前必須仰賴 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 類別,這種類別比較容易使用,也更有效率。