為了提高設備電池壽命,Android 可以通過監控設備使用和喚醒來影響設備狀態。當設備未使用時,平台可以進入睡眠狀態以暫停活動的運行。
瞌睡
當設備長時間未使用時,Doze 通過延遲應用後台 CPU 和網絡活動來延長電池壽命。
Doze 中的空閒設備會定期進入維護窗口,在此期間應用程序可以完成待處理的工作(同步、作業等)。打盹然後恢復睡眠更長的時間,然後是另一個維護窗口。平台繼續打盹睡眠/維護序列,每次增加空閒時長,直到達到最多幾個小時的睡眠時間。在任何時候,處於打瞌睡狀態的設備都會保持對運動的感知,並在檢測到運動時立即離開打盹。
Android 7.0 及更高版本擴展了 Doze,以在每次用戶關閉設備屏幕時觸發一組更輕鬆的優化,即使用戶繼續四處走動,電池續航時間也會更長。
關鍵系統服務通常由設備製造商設置為免於打瞌睡。用戶還可以使用“設置”菜單使特定應用免於打瞌睡。但是,豁免應用程序可能會導致設備耗電。默認情況下,在 AOSP 中打盹是禁用的;有關啟用打盹的詳細信息,請參閱集成打盹。
打瞌睡要求
打盹支持要求設備具有云消息傳遞服務,例如Firebase Cloud Messaging (FCM) 。外部觸發事件(例如雲消息)可以在設備保持打盹模式時臨時喚醒應用程序以完成工作。
完全打盹支持還需要設備上有一個重要的運動檢測器 (SMD) ;但是,Android 7.0 及更高版本中的輕量級 Doze 模式不需要 SMD。如果在以下設備上啟用打盹:
- 有一個 SMD,會發生完整的 Doze 優化(包括輕量級優化)。
- 沒有 SMD,只有輕量級的 Doze 優化發生。
打瞌睡生命週期
打盹在平台檢測到設備空閒時開始,並在發生一個或多個退出標準活動時結束。
檢測
平台在以下情況下檢測到設備處於空閒狀態:
- 設備是固定的(使用 SMD)。
- 設備屏幕關閉一段時間。
將電池供電的設備插入電源充電器時,打盹模式不會啟動。
打瞌睡時
該平台嘗試將系統保持在睡眠狀態,在維護窗口期間定期恢復正常操作,然後讓設備在更長的重複週期內返回睡眠狀態。在睡眠期間,以下限制處於活動狀態:
- 不允許應用程序訪問網絡。
- 應用程序喚醒鎖被忽略。
- 警報被延遲。不包括使用
setAndAllowWhileIdle()
設置的鬧鐘和鬧鐘(在打盹時,每個應用每 15 分鐘限制為 1 個)。此豁免適用於必須顯示事件提醒通知的應用程序(例如日曆)。 - 不執行 Wi-Fi 掃描。
-
SyncAdapter
同步和JobScheduler
作業推遲到下一個維護窗口。 - 接收 SMS 和 MMS 消息的應用程序會被列入臨時白名單,以便它們可以完成處理。
出口
當平台檢測到:
- 用戶與設備的交互
- 設備移動
- 設備屏幕開啟
- 即將到來的 AlarmClock 警報
通知不會導致設備退出打盹。
Android 7.0 及更高版本通過在設備空閒之前在屏幕關閉期間啟用輕量級睡眠模式來擴展 Doze。
行動 | 瞌睡 | 輕量級打瞌睡 |
---|---|---|
扳機 | 屏幕關閉,電池供電,靜止 | 屏幕關閉,使用電池(拔下) |
定時 | 連續增加維護週期 | 具有維護窗口的重複 N 分鐘週期 |
限制 | 沒有網絡訪問、喚醒鎖定或 GPS/Wi-Fi 掃描;警報和作業/同步延遲 | 無網絡訪問;作業/同步延遲,維護時段除外 |
行為 | 僅收到高優先級推送通知消息 | 收到的所有實時消息(即時消息、呼叫等);高優先級推送通知消息啟用臨時網絡訪問 |
出口 | 動作、屏幕開啟或鬧鐘鬧鐘 | 屏幕開啟 |
與 App Standby 交互
- 在打瞌睡中花費的時間不計入 App Standby。
- 當設備處於打瞌睡狀態時,空閒的應用程序每天至少可以執行一次正常操作。
集成打瞌睡
啟用 Doze 後,支持SENSOR_TYPE_SIGNIFICANT_MOTION
的設備會執行完整的 Doze 優化(包括輕量級優化);沒有 SMD 的設備只執行輕量級的 Doze 優化。 Android 會自動選擇適當的打盹優化,無需供應商配置。
要為設備啟用打盹:
- 確認設備已安裝雲消息服務。
- 在設備覆蓋配置文件
overlay/frameworks/base/core/res/res/values/config.xml
中,將config_enableAutoPowerModes
設置為true
:<bool name="config_enableAutoPowerModes">true</bool>
在 AOSP 中,此參數默認設置為false
(Doze disabled)。 - 確認預加載的應用和服務:
- 確認必要的服務免於打瞌睡。
提示
- 如果可能,使用 FCM 進行下游消息傳遞。
- 如果您的用戶必須立即看到通知,請使用FCM 高優先級消息。
- 在初始消息負載中提供足夠的信息(以避免不必要的後續網絡訪問)。
- 使用
setAndAllowWhileIdle()
和setExactAndAllowWhileIdle()
設置嚴重警報。
測試和優化應用程序
在打盹模式下測試所有應用程序(尤其是預加載的應用程序)。有關詳細信息,請參閱使用 Doze 和 App Standby 進行測試。