針對打盹和應用程式待命進行最佳化

Android 有兩項省電功能,可在裝置未連接電源時,管理應用程式的行為,藉此延長電池續航力:打盹模式和應用程式待命模式。當裝置長時間未使用時,休眠模式會延遲應用程式的背景 CPU 和網路活動,藉此降低電池耗電量。應用程式待命模式會延遲最近沒有使用者活動的應用程式背景網路活動。

當裝置處於打盹模式時,應用程式對某些耗電資源的存取權會延遲到維護期間。如需具體限制項目清單,請參閱「電源管理限制」一文。

無論應用程式是否指定目標 API 級別 23,在 Android 6.0 以上版本執行的所有應用程式,其行為都由「打盹」和「應用程式待命」模式管理。為確保使用者享有最佳體驗,請在打盹和應用程式待命模式下測試應用程式,並視需要調整程式碼。詳情請參閱下列各節。

瞭解打盹模式

如果使用者將裝置拔除電源並靜置一段時間,且螢幕關閉,裝置就會進入打盹模式。在打盹模式下,系統會限制應用程式存取網路和 CPU 密集服務,藉此節省電池電力。此外,系統也會禁止應用程式存取網路,並延遲其工作、同步處理和標準鬧鐘。

系統會定期短暫退出打盹模式,讓應用程式完成延遲的活動。在這個維護期間,系統會執行所有待處理的同步作業、工作和鬧鐘,並允許應用程式存取網路。

圖 1. Doze 模式會定期提供維護期間,讓應用程式使用網路並處理待處理活動。

維護期間結束後,系統會再次進入打盹模式,暫停網路存取,並延遲工作、同步處理和鬧鐘。隨著時間推移,系統會減少排定維護期間的頻率,有助於在裝置未充電且長時間閒置時減少電池消耗。

當使用者移動裝置、開啟螢幕或連接充電器來喚醒裝置時,系統會退出打盹模式,所有應用程式也會恢復正常活動。

Doze 限制

裝置處於打盹模式時,系統會對應用程式套用下列限制:

打盹模式檢查清單

  • 如果可以,請使用 Firebase 雲端通訊 (FCM) 傳送下游訊息。
  • 如果使用者必須立即看到通知,請使用 RemoteNotification 訊息類型。如需更多指引,請參閱 FCM 說明文件 中的 RemoteNotification 訊息類型。
  • 在初始訊息酬載中提供足夠的資訊,這樣就不需要後續的網路存取。
  • 使用 setAndAllowWhileIdle() 和 setExactAndAllowWhileIdle() 設定重要鬧鐘。
  • 在打盹模式下測試應用程式。

調整應用程式以配合打盹模式

Doze 模式對應用程式的影響可能不盡相同,具體取決於應用程式提供的功能和使用的服務。許多應用程式在 Doze 週期內都能正常運作,不需修改。在某些情況下,您必須最佳化應用程式管理網路、鬧鐘、工作和同步處理的方式。應用程式必須能在每個維護期間有效管理活動。

如要排定鬧鐘,可以使用 setAndAllowWhileIdle() 和 setExactAndAllowWhileIdle() 這兩種 AlarmManager 方法。使用這些方法,即使裝置處於打盹模式,您也可以設定觸發鬧鐘。

Doze 模式對網路存取的限制也可能影響應用程式,尤其是仰賴即時訊息 (例如 tickle 或通知) 的應用程式。如果應用程式需要持續連線至網路才能接收訊息,請盡可能使用 Firebase 雲端通訊 (FCM)。

如要確認應用程式在 Doze 模式下的行為符合預期,您可以使用 adb 指令強制系統進入及退出 Doze 模式,並觀察應用程式的行為。詳情請參閱「使用打盹和應用程式待命功能進行測試」。

瞭解應用程式待命模式

應用程式待命模式可讓系統在使用者未主動使用應用程式時,判斷應用程式處於閒置狀態。當使用者在一段時間內未輕觸應用程式,且不符合下列任一條件時,系統就會做出這項判斷:

  • 使用者明確啟動應用程式。
  • 應用程式目前有前景程序,可能是活動或前景服務,或由其他活動或前景服務使用。
  • 應用程式會產生通知,使用者會在螢幕鎖定畫面或通知匣中看到。

當使用者將裝置接上電源時,系統會將應用程式從待機狀態中釋放,讓應用程式自由存取網路,並執行任何待處理的工作和同步作業。如果裝置長時間處於閒置狀態,系統會允許閒置應用程式每天存取網路約一次。

在裝置閒置時使用 FCM 與應用程式互動

Firebase 雲端通訊 (FCM) 是一項雲端到裝置服務,可讓您在 Android 裝置上的後端服務和應用程式之間,支援即時下游訊息。FCM 提供單一、持續的雲端連線。所有需要即時訊息功能的應用程式都可以共用這個連線。這項共用連線可大幅降低電池消耗量,因為多個應用程式不必各自維護永久連線,而永久連線可能會快速耗盡電池電力。因此,如果應用程式需要與後端服務整合訊息,強烈建議您盡可能使用 FCM,而非自行維護永久網路連線。

FCM 經過最佳化調整,可搭配打盹和應用程式待命閒置模式使用。FCM RemoteNotification 訊息類型可喚醒應用程式,與使用者互動。在打盹或應用程式待命模式下,系統會傳送訊息,並授予應用程式網路服務和部分喚醒鎖定的暫時存取權,然後將裝置或應用程式恢復為閒置狀態。對於具時效性、使用者可見的通知,請考慮使用 RemoteNotification 訊息類型,以便在打盹模式下傳送。這類訊息可能會觸發通知。如要進一步瞭解 RemoteNotification,請參閱 FCM 指南。

如果訊息不會產生通知,例如在背景更新應用程式內容或啟動資料同步,請使用BackgroundSync FCM 訊息。這類訊息的優先順序刻意設為低,可能會延遲或限制傳送,以盡量節省裝置電池用量。

一般最佳做法是,如果應用程式需要下游訊息,請使用 FCM。如果應用程式已使用 FCM,請確認應用程式會針對會產生面向使用者通知的訊息使用 RemoteNotification。

請勿在下列情況使用 RemoteNotification:

  • 絕對不會顯示通知的情況。
  • 立即傳送僅更新應用程式狀態的訊息,例如在背景更新應用程式內容,或啟動資料同步作業。
  • 提示使用者授予權限。

支援其他用途

幾乎所有應用程式都能透過管理網路連線、鬧鐘、工作和同步處理,以及使用 FCM 訊息來支援打盹模式。在少數用途中,這可能不夠。在這種情況下,系統會提供可設定的應用程式清單,這些應用程式可部分豁免打盹和應用程式待命最佳化。

部分豁免的應用程式可在 Doze 和應用程式待命模式期間使用網路,並保留部分 Wake Lock。不過,該應用程式仍須遵守其他限制,就像其他應用程式一樣。舉例來說,在 API 級別 23 以下,應用程式的工作和同步作業會延遲,且一般 AlarmManager 鬧鐘不會觸發。應用程式可以呼叫 isIgnoringBatteryOptimizations(),檢查目前是否在豁免清單中。

使用者可以依序前往「設定」>「電池」>「電池最佳化」,手動設定豁免應用程式清單。或者,系統也提供方法,讓應用程式要求使用者豁免:

應用程式可以呼叫 isIgnoringBatteryOptimizations(),檢查目前是否在豁免清單中。

使用打盹和應用程式待命功能進行測試

為確保使用者享有良好體驗,請在打盹和應用程式待命模式下,全面測試應用程式。

使用 Doze 模式測試應用程式

您可以按照下列步驟測試打盹模式:

  1. 使用 Android 6.0 (API 級別 23) 以上版本的系統映像檔,設定硬體裝置或虛擬裝置。
  2. 將裝置連接至開發機器,並安裝應用程式。
  3. 執行應用程式,並保持啟用狀態。
  4. 執行下列指令,強制系統進入閒置模式:
        $ adb shell dumpsys deviceidle force-idle
        
  5. 準備就緒後,請執行下列指令,退出閒置模式:
        $ adb shell dumpsys deviceidle unforce
        
  6. 執行下列指令,重新啟用裝置:
        $ adb shell dumpsys battery reset
        
  7. 重新啟用裝置後,觀察應用程式的行為。確認裝置退出打盹模式時,應用程式能順利恢復運作。

使用應用程式待命模式測試應用程式

如要測試應用程式的應用程式待命模式,請按照下列步驟操作:

  1. 使用 Android 6.0 (API 級別 23) 以上版本的系統映像檔,設定硬體裝置或虛擬裝置。
  2. 將裝置連接至開發機器,並安裝應用程式。
  3. 執行應用程式,並保持啟用狀態。
  4. 執行下列指令,強制應用程式進入待命模式:
        $ adb shell dumpsys battery unplug
        $ adb shell am set-inactive <packageName> true
        
  5. 使用下列指令模擬喚醒應用程式:
        $ adb shell am set-inactive <packageName> false
        $ adb shell am get-inactive <packageName>
        
  6. 觀察應用程式喚醒後的行為。確認應用程式能順利從待機模式恢復。請特別檢查應用程式的通知和背景工作是否正常運作。

豁免條件

下表列出幾種用途,以及應用程式在這些情況下是否適合使用 ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS 意圖動作。一般來說,除非應用程式的核心功能因打盹模式或應用程式待命模式而中斷,或因技術原因無法使用 FCM RemoteNotification 訊息,否則不符合這些例外狀況。

詳情請參閱「其他用途的支援」。

類型 用途 可以使用 FCM 嗎? 是否可豁免? 附註
即時通訊、聊天或通話應用程式。 裝置處於打盹模式或應用程式處於待命模式時,需要向使用者傳送即時訊息。 是,使用 FCM 無法接受 使用 FCM RemoteNotification 訊息喚醒應用程式並存取網路。
是,但未使用 FCM RemoteNotification 訊息。
即時通訊、聊天或通話應用程式; 企業網路電話應用程式。 否,由於技術上依賴其他訊息服務,因此無法使用 FCM,或 Doze 和應用程式待命模式會破壞應用程式的核心功能。 可接受
「安全」應用程式。 保護使用者及其家人的應用程式。 依適用情況提供。 可接受
工作自動化應用程式。 應用程式的核心功能是排定自動化動作,例如即時通訊、語音通話或新相片管理。 依適用情況提供。 可接受
周邊裝置隨附應用程式。 應用程式的核心功能是與周邊裝置保持連線,以便為周邊裝置提供網路連線能力。 依適用情況提供。 可接受
應用程式只需要定期連線至周邊裝置進行同步,或只需要連線至透過標準藍牙設定檔連線的裝置,例如無線耳機。 依適用情況提供。 無法接受