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