Android 提供兩項省電功能,透過在裝置未連接電源時管理應用程式的行為:打盹和應用程式待命,藉此延長使用者的電池續航力。打盹功能會在裝置長時間未使用時,延後應用程式的背景 CPU 和網路活動,以降低電池耗電量。應用程式待命會延後沒有使用者活動的應用程式背景網路活動。
當裝置處於打盹模式時,應用程式會延後到維護期間,才能存取某些耗用大量電力的資源。如需具體限制項目清單,請參閱「電源管理限制」一文。
無論應用程式是否特別指定 API 級別 23,「打盹和應用程式待命」功能都可以管理所有在 Android 6.0 以上版本中執行的應用程式行為。為確保使用者能獲得最佳體驗,請在打盹和應用程式待命模式下測試應用程式,並對程式碼進行必要的調整。以下各節將詳細說明。
瞭解打盹功能
如果使用者在裝置未接上電源的情況下停留一段時間,當螢幕關閉時,裝置會進入打盹模式。在打盹模式下,系統會限制應用程式存取網路和 CPU 用量的服務,藉此節省電池電力。這項設定也會防止應用程式存取網路,並延後其工作、同步處理和標準鬧鐘。
系統會定期短暫退出 Doze 模式,讓應用程式完成延後的活動。在這個維護期間,系統會執行所有待處理的同步作業、工作和鬧鐘,並讓應用程式存取網路。
維護期間結束後,系統會再次進入打盹、暫停網路存取及延後工作、同步和鬧鐘。一段時間過後,系統會在裝置未充電時減少維護期間的頻率,進而在閒置時間過長的情況下減少電池耗電量。
當使用者以移動裝置、開啟螢幕或連接充電器的方式喚醒裝置時,系統會結束「打盹」,所有應用程式將恢復正常活動。
Doze 限制
在「打盹」模式下,系統會對應用程式套用下列限制:
- 暫停網路存取權。
- 忽略 Wake Lock。
- 將標準
AlarmManager
鬧鐘 (包括setExact()
和setWindow()
) 延後到下一個維護期間。- 如要設定在打盹模式觸發的鬧鐘,請使用
setAndAllowWhileIdle()
或setExactAndAllowWhileIdle()
。 - 使用
setAlarmClock()
設定的鬧鐘會繼續正常觸發。系統會在這些鬧鐘觸發前退出 Doze 模式。
- 如要設定在打盹模式觸發的鬧鐘,請使用
- 不會掃描 Wi-Fi。
- 不讓同步轉換介面執行。
- 不讓
JobScheduler
執行。
Doze 檢查清單
- 盡可能使用 Firebase 雲端通訊 (FCM) 傳送下游訊息。
- 如果使用者必須立即看到通知,請使用 FCM 高優先順序訊息。請只針對會產生通知的訊息使用高優先順序。詳情請參閱 FCM 的 Android 訊息優先順序說明文件。
- 在初始訊息酬載中提供足夠的資訊,這樣就不用再存取網路。
- 使用
setAndAllowWhileIdle()
和setExactAndAllowWhileIdle()
設定重要警報。 - 在 Doze 模式下測試應用程式。
根據打盹模式調整應用程式
視應用程式提供的功能和使用的服務而定,打盹方式對應用程式的影響可能有所不同。許多應用程式可在打盹週期之間正常運作,而不會經過修改。在某些情況下,您必須最佳化應用程式管理網路、鬧鐘、工作和同步處理的方式。應用程式必須能在每個維護期間有效管理活動。
如要安排鬧鐘,您可以使用兩種 AlarmManager
方法:setAndAllowWhileIdle()
和 setExactAndAllowWhileIdle()
。只要使用這些方法,就能設定即使裝置處於打盹模式,也能觸發鬧鐘。
網路存取的打盹限制也可能會影響您的應用程式,尤其是如果應用程式依賴滴答或通知等即時訊息。如果您的應用程式需要與網路永久連線才能接收訊息,請盡可能使用 Firebase 雲端通訊 (FCM)。
如要確認應用程式在使用打盹功能時正常運作,您可以使用 adb
指令強制系統進入並結束「打盹」模式,然後觀察應用程式的行為。詳情請參閱「使用打盹和應用程式待命功能進行測試」。
瞭解應用程式待命功能
應用程式待命功能可在使用者處於閒置狀態時,判斷應用程式是否處於閒置狀態。當使用者在特定時間未接觸應用程式,且不符合以下條件時,系統會做出此決定:
- 使用者明確啟動應用程式。
- 應用程式目前在前景執行的程序,可能是活動或前景服務,也可能是由其他活動或前景服務使用。
- 應用程式會產生通知,讓使用者在螢幕鎖定畫面或通知匣中看到。
當使用者將裝置插入電源供應器時,系統會從待機狀態發布應用程式,讓使用者自由存取網路並執行任何待處理的工作和同步作業。如果裝置處於閒置狀態的時間過長,系統會允許閒置應用程式大約每天存取網路。
使用 FCM 在裝置處於閒置狀態時與應用程式互動
Firebase 雲端通訊 (FCM) 是一項雲端對裝置服務,可讓您支援在後端服務和 Android 裝置上的應用程式之間,即時處理下游訊息。FCM 會提供單一雲端連線。所有需要即時通訊的應用程式都能共用這個連結。這種共用連線大幅提高電池耗電量,讓多個應用程式不必維持各自的永久連線,導致電池快速耗盡。因此,如果您的應用程式需要與後端服務整合訊息功能,強烈建議您盡可能使用 FCM,而不要使用自己的永久網路連線。
FCM 經過最佳化,可與打盹和應用程式待命模式搭配使用。FCM 高優先順序訊息可讓您喚醒應用程式,以便吸引使用者。在打盹或應用程式待命模式下,系統會傳送訊息,並授予應用程式暫時存取網路服務和部分 Wake Lock 的權限,然後將裝置或應用程式傳回閒置狀態。對於可讓使用者查看的通知具有時效性,請考慮使用高優先順序訊息,以便在打盹模式中啟用傳送功能。高優先順序訊息可能會導致通知。如需進一步瞭解高優先順序訊息,請參閱 FCM 的指南。
如果訊息不會產生通知 (例如在背景保持應用程式內容更新,或啟動資料同步作業),請使用一般優先順序的 FCM 訊息。如果裝置不在「打盹」中,系統會立即傳送一般優先順序的訊息。如果裝置處於打盹模式,系統會在定期打盹模式維護期間,或是在使用者喚醒裝置後立即傳送裝置。
一般而言,如果應用程式需要下游訊息,請使用 FCM。如果應用程式已使用 FCM,請確認應用程式只會針對會產生使用者通知的訊息使用高優先順序訊息。
其他用途的支援功能
幾乎所有應用程式都能透過管理網路連線、鬧鐘、工作和同步處理作業,以及使用 FCM 訊息的方式支援打盹功能。在少數用途中,這可能不夠用。在這些情況下,系統會提供可設定的應用程式清單,這些應用程式可以部分不受打盹和應用程式待命最佳化功能的執行。
部分豁免的應用程式可以在 Doze 和 App Standby 期間使用網路,並保留部分喚醒鎖定。不過,應用程式仍會受到其他限制,就像其他應用程式一樣。舉例來說,API 級別 23 以下的應用程式工作和同步處理作業會延後,而一般的 AlarmManager
鬧鐘不會觸發。應用程式可以呼叫 isIgnoringBatteryOptimizations()
,確認應用程式目前是否在豁免清單上。
使用者可以依序前往「設定」>「電池」>「電池最佳化」,手動設定豁免應用程式清單。或者,系統也能讓應用程式向使用者要求豁免:
- 大多數應用程式都可以叫用包含
ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS
的意圖。 - 符合可接受的用途的應用程式,可以改為叫用包含
ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
意圖動作的意圖,讓使用者直接將應用程式新增至豁免清單,而無需前往系統設定。
應用程式可以呼叫 isIgnoringBatteryOptimizations()
,確認目前是否在豁免清單上。
使用打盹和應用程式待命功能進行測試
為確保使用者享有良好體驗,請在 Doze 和 App Standby 中全面測試應用程式。
使用 Doze 測試應用程式
如要測試 Doze 模式,請按照下列步驟操作:
- 使用 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>
- 觀察喚醒應用程式後的行為。請確保應用程式能夠從待命模式妥善復原。特別是,請檢查應用程式的通知和背景工作是否能正常運作。
使用限制的使用限制
下表重點說明幾種用途,以及應用程式是否能在這些情況下使用 ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
意圖動作。一般來說,除非 Doze 或 App Standby 會導致應用程式的核心功能無法正常運作,或是應用程式無法使用 FCM 高優先順序訊息,否則應用程式不會符合這些例外狀況。
詳情請參閱其他用途的支援。
類型 | 用途 | 可以使用 FCM 嗎? | 是否接受豁免? | 附註 |
---|---|---|---|---|
即時通訊、即時通訊或通話應用程式。 | 要求在裝置處於「打盹」模式或應用程式處於「應用程式待命」模式時,向使用者傳送即時訊息。 | 是,使用 FCM | 不接受 | 使用 FCM 高優先順序訊息喚醒應用程式並存取網路。 |
是的,但並非使用 FCM 高優先順序訊息。 | ||||
即時通訊、聊天或通話應用程式;企業 VOIP 應用程式。 | 否,由於其他訊息服務或打盹和應用程式待命功能的技術依附元件依賴 FCM,因此無法使用 FCM。 | 可接受 | ||
「安全」應用程式。 | 應用程式能保障使用者與家庭安全。 | 依適用情況提供。 | 可接受 | |
工作自動化應用程式。 | 應用程式的核心功能是排定自動化動作的時間,例如即時通訊、語音通話或新相片管理。 | 依適用情況提供。 | 可接受 | |
週邊裝置隨附應用程式。 | 應用程式的核心功能是讓週邊裝置保持與週邊裝置之間的持續連線,以讓週邊裝置連上網際網路。 | 依適用情況提供。 | 可接受 | |
應用程式只需要定期連線至週邊裝置即可同步,或者只需要連線到透過標準藍牙設定檔連線的裝置 (例如無線耳機)。 | 依適用情況提供。 | 不接受 |