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