https://developer.android.google.cn/training/monitoring-device-state/doze-standby
針對低電耗模式和應用待機模式進行優化
從 Android 6.0(API 級別 23)開始,Android 引入了兩項省電功能,通過管理應用在設備未連接至電源時的行爲方式,幫助用戶延長電池壽命。當用戶長時間未使用設備時,低電耗模式會延遲應用的後臺 CPU 和網絡活動,從而降低耗電量。應用待機模式會延遲用戶近期未與之交互的應用的後臺網絡活動。
當設備處於低電耗模式時,應用對某些高耗電量資源的訪問會延遲到維護期。電源管理限制中列出了具體的限制。
低電耗模式和應用待機模式管理在 Android 6.0 或更高版本上運行的所有應用的行爲,無論它們是否專用於 API 級別 23。爲確保用戶獲得最佳體驗,請在低電耗模式和應用待機模式下測試您的應用,並對您的代碼進行必要的調整。下面幾部分提供了詳細信息。
瞭解低電耗模式
如果用戶未插接設備的電源,在屏幕關閉的情況下,讓設備在一段時間內保持不活動狀態,那麼設備就會進入低電耗模式。在低電耗模式下,系統會嘗試通過限制應用訪問佔用大量網絡和 CPU 資源的服務來節省電量。它還會阻止應用訪問網絡,並延遲其作業、同步和標準鬧鐘。
系統會定期退出低電耗模式一小段時間,讓應用完成其延遲的活動。在此維護期內,系統會運行所有待處理的同步、作業和鬧鐘,並允許應用訪問網絡。
圖 1. 低電耗模式提供了週期性維護期,讓應用使用網絡並處理待處理的活動。
在每個維護期結束時,系統會再次進入低電耗模式,暫停網絡訪問並推遲作業、同步和鬧鐘。隨着時間的推移,系統安排維護期的次數越來越少,這有助於在設備未連接至充電器的情況下長期處於不活動狀態時降低耗電量。
一旦用戶通過移動設備、打開屏幕或連接至充電器喚醒設備,系統就會立即退出低電耗模式,並且所有應用都會恢復正常活動。
低電耗模式限制
在低電耗模式下,您的應用會受到以下限制:
- 暫停訪問網絡。
- 系統忽略喚醒鎖定。
- 標準
AlarmManager
鬧鐘(包括setExact()
和setWindow()
)推遲到下一個維護期。 -
- 如果您需要設置在設備處於低電耗模式時觸發的鬧鐘,請使用
setAndAllowWhileIdle()
或setExactAndAllowWhileIdle()
。 - 使用
setAlarmClock()
設置的鬧鐘將繼續正常觸發,系統會在這些鬧鐘觸發之前不久退出低電耗模式。
- 如果您需要設置在設備處於低電耗模式時觸發的鬧鐘,請使用
- 系統不執行 WLAN 掃描。
- 系統不允許運行同步適配器。
- 系統不允許運行
JobScheduler
。
使應用適應低電耗模式
低電耗模式可能會對應用產生不同的影響,具體取決於應用提供的功能和使用的服務。許多應用無需修改即可在低電耗模式週期內正常運行。在某些情況下,您必須優化應用管理網絡、鬧鐘、作業和同步的方式。應用應該能夠在每個維護期內高效地管理活動。
低電耗模式尤其可能會影響 AlarmManager
鬧鐘和定時器管理的活動,因爲當系統處於低電耗模式時,不會觸發 Android 5.1(API 級別 22)或更低版本中的鬧鐘。
爲了幫助安排鬧鐘,Android 6.0(API 級別 23)引入了兩種新的 AlarmManager
方法:setAndAllowWhileIdle()
和 setExactAndAllowWhileIdle()
。通過這些方法,您可以設置即使設備處於低電耗模式也會觸發的鬧鐘。
注意:setAndAllowWhileIdle()
及 setExactAndAllowWhileIdle()
爲每個應用觸發鬧鐘的頻率都不能超過每 9 分鐘一次。
瞭解應用待機模式
應用待機模式允許系統判定應用在用戶未主動使用它時是否處於閒置狀態。當用戶有一段時間未觸摸應用時,系統便會作出此判定,以下條件均不適用:
- 用戶明確啓動應用。
- 應用當前有一個進程在前臺運行(作爲活動或前臺服務,或者正在由其他活動或前臺服務使用)。
注意:您只能將前臺服務用於用戶希望系統立即執行或不中斷的任務。此類情況包括將照片上傳到社交媒體,或者即使在音樂播放器應用不在前臺運行時也能播放音樂。您不應該只是爲了阻止系統判定您的應用處於閒置狀態而啓動前臺服務。
- 應用生成用戶可在鎖定屏幕或通知欄中看到的通知。
- 應用是正在使用中的設備管理應用(例如設備策略控制器)。雖然設備管理應用通常在後臺運行,但永遠不會進入應用待機模式,因爲它們必須保持可用性,以便隨時從服務器接收策略。
當用戶將設備插入電源時,系統會從待機狀態釋放應用,允許它們自由訪問網絡並執行任何待處理的作業和同步。如果設備長時間處於閒置狀態,系統將允許閒置應用訪問網絡,頻率大約每天一次。
對其他用例的支持
通過妥善管理網絡連接、鬧鐘、作業和同步以及使用高優先級 FCM 消息,幾乎所有應用都應該能夠支持低電耗模式。對於一小部分用例,這可能還不夠。對於此類用例,系統提供了一個可配置的白名單,將部分免除低電耗模式和應用待機模式優化的應用列入其中。
在低電耗模式和應用待機模式期間,列入白名單的應用可以使用網絡並保留部分喚醒鎖定。不過,列入白名單的應用仍會受到其他限制,就像其他應用一樣。例如,列入白名單的應用的作業和同步會延遲(在搭載 API 級別 23 及更低級別的設備上),並且其常規 AlarmManager
鬧鐘不會觸發。應用可以調用 isIgnoringBatteryOptimizations()
來檢查它當前是否在豁免白名單中。
用戶可以依次轉到設置 > 電池 > 電池優化來手動配置該白名單。另外,系統也提供了一些方法,讓應用要求用戶將其列入白名單。
- 應用可以觸發
ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS
Intent,讓用戶直接轉到電池優化,以便他們在其中添加該應用。 - 具有
REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
權限的應用可以觸發一個系統對話框,讓用戶直接將該應用添加到白名單,而無需轉到“設置”。此類應用將通過觸發ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
Intent 來觸發該對話框。 - 用戶可以根據需要從白名單中手動移除應用。
在要求用戶將您的應用添加到白名單之前,請確保該應用符合列入白名單的可接受用例。
注意:除非應用的核心功能受到不利影響,否則 Google Play 政策禁止應用請求直接免除 Android 6.0 及更高版本中的電源管理功能(低電耗模式和應用待機模式)的制約。
在低電耗模式和應用待機模式下進行測試
爲確保用戶獲得良好的體驗,您應在低電耗模式和應用待機模式下全面測試您的應用。
在低電耗模式下測試您的應用
您可以按以下步驟在低電耗模式下測試您的應用:
- 使用 Android 6.0(API 級別 23)或更高版本的系統映像配置硬件設備或虛擬設備。
- 將設備連接到開發計算機並安裝您的應用。
- 運行您的應用並使其保持活動狀態。
- 運行以下命令,強制系統進入閒置模式:
$ adb shell dumpsys deviceidle force-idle
- 準備就緒後,運行以下命令,使系統退出閒置模式:
$ adb shell dumpsys deviceidle unforce
- 執行以下命令,重新激活設備:
$ adb shell dumpsys battery reset
- 在重新激活設備後觀察應用的行爲。確保應用在設備退出低電耗模式時正常恢復。
在應用待機模式下測試您的應用
要在應用待機模式下測試您的應用,請執行以下操作:
- 使用 Android 6.0(API 級別 23)或更高版本的系統映像配置硬件設備或虛擬設備。
- 將設備連接到開發計算機並安裝您的應用。
- 運行您的應用並使其保持活動狀態。
- 運行以下命令,強制應用進入應用待機模式:
$ adb shell dumpsys battery unplug $ adb shell am set-inactive <packageName> true
- 使用以下命令模擬喚醒您的應用:
$ adb shell am set-inactive <packageName> false $ adb shell am get-inactive <packageName>
- 在喚醒應用後觀察它的行爲。確保應用從待機模式正常恢復。您應特別檢查應用的通知和後臺作業是否繼續按預期運行。
列入白名單的可接受用例
下表重點介紹了請求將應用列入電池優化豁免白名單或應用目前在該白名單中的可接受用例。一般來說,除非低電耗模式或應用待機模式破壞了應用的核心功能,或者由於技術方面的原因而導致您的應用無法使用高優先級 FCM 消息,否則您的應用不應在白名單中。
如需瞭解詳情,請參閱對其他用例的支持。
類型 | 用例 | 是否可以使用 FCM? | 是否可接受列入白名單? | 備註 |
---|---|---|---|---|
即時通訊、聊天或通話應用。 | 當設備處於低電耗模式或應用處於應用待機模式時,需要將實時消息傳遞給用戶。 | 是,使用 FCM | 不可接受 | 應使用高優先級 FCM 消息喚醒應用並訪問網絡。 |
是,但不使用高優先級 FCM 消息。 | ||||
即時通訊、聊天或通話應用;企業 VOIP 應用。 | 否,不能使用 FCM,因爲在技術上依賴其他消息傳遞服務,或者低電耗模式和應用待機模式破壞了應用的核心功能。 | 可接受 | ||
任務自動化應用 | 應用的核心功能是安排自動化操作,例如即時通訊、語音通話、新照片管理或位置操作。 | 如果適用。 | 可接受 | |
外圍設備配套應用 | 應用的核心功能是保持與外圍設備的持久性連接,以使外圍設備能夠接入互聯網。 | 如果適用。 | 可接受 | |
應用只需定期連接到外圍設備進行同步,或者只需連接到通過標準藍牙配置文件連接的設備,如無線耳機。 | 如果適用。 | 不可接受 |
總結
省電功能:低電耗模式和應用待機模式
低電耗模式會延遲應用的後臺 CPU 和網絡活動
- 暫停訪問網絡。
- 系統忽略喚醒鎖定。
- 標準
AlarmManager
鬧鐘(包括setExact()
和setWindow()
)推遲到下一個維護期。
- 如果您需要設置在設備處於低電耗模式時觸發的鬧鐘,請使用
setAndAllowWhileIdle()
或setExactAndAllowWhileIdle()
。- 使用
setAlarmClock()
設置的鬧鐘將繼續正常觸發,系統會在這些鬧鐘觸發之前不久退出低電耗模式。- 系統不執行 WLAN 掃描。
- 系統不允許運行同步適配器。
- 系統不允許運行
JobScheduler
。
應用待機模式會延遲用戶近期未與之交互的應用的後臺網絡活動。