1. 程式人生 > >Android Doze和應用待機優化

Android Doze和應用待機優化

Contents

Doze和應用待機優化... 1

理解Doze. 1

Doze的限制... 1

調整應用適應Doze. 2

理解應用待機... 2

裝置idle時用FCM和應用互動... 3

其他情況的支援... 3

測試Doze和應用待機... 4

測試Doze下的應用... 4

應用待機時測試應用... 4

可以白名單的情況... 5

 

Doze和應用待機優化

從Android 6.0(API 23)開始,Android引入了一套改善電池壽命的功能特性,這套特性在手機不連電源的時候,通過改變應用行為方式來省電。當裝置長時間不用的時候,Doze通過延遲應用對後臺的CPU和網路請求來省電。應用待機通過延遲使用者長時間沒使用的應用的對後臺網路的請求省電。

當裝置進入Doze模式時,應用對某些耗電資源的請求會被延遲到維護視窗。這些特定限制列在電源管理限制中。

Doze和應用待機管理所有執行在Android 6.0及之後的平臺上的應用,不管它是否將目標API設為23。為了保證最好的使用者體驗,請在Doze和應用待機情況下測試你的應用並做出必要調整。下面提供細節。

理解Doze

當用戶不插電,保持一段時間不動手機,關螢幕一段時間後,手機進入Doze模式。在Doze模式,系統通過限制應用連線網路和高CPU消耗的服務來省電。系統還會禁止應用聯網,延時job,同步和標準鬧鈴的請求。

系統週期性的短期退出Doze模式讓應用在維護視窗期完成被延時的操作。在維護視窗期,系統將執行所有延時的同步,job,鬧鈴,並允許應用連線網路。

在每個維護視窗結束時,系統重新進入Doze模式,掛起網路,並延時job,同步和鬧鈴。隨著時間的推移,系統進入維護視窗的週期越來越長,保證手機不連電源並長時間不用的時候省電。

只要使用者移動手機或者開啟螢幕或者連上電源等喚醒手機,系統就會退出Doze模式,所有的應用恢復正常執行模式。

Doze的限制

在Doze模式下,存在下面的限制:

  • 網路被掛起。
  • 系統忽略喚醒鎖。
  • 標準的AlarmManager鬧鈴(包括setExact()和setWindow())被延時到下一個維護視窗。
    • 如果你要設一個在Doze模式下依然喚醒的鬧鈴,需要用setAndAllowWhileIdle()或setExactAndAllowWhileIdle()。
    • 用setAlarmClock()設的鬧鈴會正常啟動——系統在這種鬧鈴啟動之前短期退出Doze。
  • 系統不進行WIFI掃描。
  • 系統不允許同步執行。
  • 系統不允許JobScheduler執行。

Doze備忘錄

  • 如果可能,用FCM下發訊息。
  • 如果需要讓使用者馬上看到一條通知,呼叫高優先順序FCM訊息。
  • 初始化訊息時,提供足夠的資訊,而不是在後續的操作中不斷進行網路請求。
  • 緊急的鬧鈴用setAndAllowWhileIdle()和setExactAndAllowIdle()設。
  • 測試應用在Doze模式下的工作情況。

調整應用適應Doze

應用提供的功能和他們使用的服務的不同決定了Doze對應用的影響不同。很多應用不用改也能在Doze模式下正常工作。但有些情況下,你必須優化應用管理網路,鬧鐘,job或同步的處理。應用應該在維護視窗期高效的管理活動。

Doze最有可能影響AlarmManager的鬧鈴和計時器的功能,因為在Android 5.1(API 22)之前的所有鬧鈴在Doze模式下都不會啟動。

為了排程鬧鈴,Android6.0(API23)提供了兩個新方法:setAndAllowWhileIdle()和setExactAndAllowWhileIdle()。有了這些方法,你可以設定在Doze模式下依然啟動的鬧鐘。

注意:應用通過setAndAllowWhileIdle()和setExactAndAllowWhileIdle()設的鬧鐘9分鐘內最多啟動一次。

Doze對網路的限制也可能影響你的應用,尤其會影響那些實時訊息,比如通知。如果你的應用要一直聯網接受訊息,那麼儘量使用FCM。

你可以用adb命令把手機設定成Doze模式,或從Doze模式恢復,然後測試應用。詳情請看:Doze和應用待機測試。

理解應用待機

應用待機即當用戶長時間不用某個應用的時候,系統把那個應用歸為idle狀態。系統在使用者查功能時間沒使用某個應用並且不滿足以下任意一點時,把應用歸為idle:

  • 使用者顯示啟動該應用。
  • 應用有一個前臺程序(如Activity或前臺服務,或正在被其他activity或前臺服務呼叫)。

注意:你只能在使用者期望系統馬上執行或不希望被打斷的情況下使用前臺服務。具體例子包括通過社交軟體上傳圖片,音樂播放器應用不在前臺時播放音樂。不應該為了不讓系統把你的應用設為idle狀態而啟動前臺服務。

  • 要在鎖屏介面或通知欄顯示給使用者一個通知。
  • 應用是一個活動的裝置管理應用(比如,裝置策略控制器應用)。儘管他們只在後臺執行,裝置管理應用永遠不會被置為待機模式,因為他們隨時要從伺服器接收策略配置訊息。

當裝置連上外接電源時,系統恢復所有應用的待機狀態,允許他們進行網路連線並執行被推遲的job和同步操作。如果系統進入idle狀態很長時間了,系統大約允許idle應用 一天連一次網。

裝置idle時用FCM和應用互動

FCM是一個 雲對裝置的服務,這個服務使得後端的伺服器實時向Android裝置上的應用傳送訊息。FCM提供了一個獨立的持續的後臺連線,所有需要實時訊息的應用都可以分享這個連線。這個分享的連線大大降低了電源的消耗,因為大量應用各自維護自己對後臺的持續的網路連線會快速降低電量。鑑於此,如果您的應用需要後臺服務的訊息,強烈建議你儘可能使用FCM,而不是維護自己的持續網路連線。

FCM做了優化從而能夠在Doze和應用待機下,通過高優先順序訊息進行工作。FCM的高優先順序訊息能夠可靠的在Doze或者應用idle狀態下,使用網路連線。在Doze和應用待機狀態下,系統傳輸完訊息或臨時給應用開通了網路或喚醒鎖後,系統或應用重新進入idle。

高優先順序FCM訊息不另外影響Doze和應用待機模式。這意味著你的應用可以在最低的電量消耗下進行高效的網路互動。

如果你的應用需要下行的訊息,作為最基本的最好的練習,最好使用FCM。如果你的服務和客戶端已經使用了FCM,用高優先順序訊息傳輸緊急訊息,因為它可以在Doze和應用待機下正常工作。

其他情況的支援

幾乎所有的應用都應該支援Doze,合適的管理網路連線,鬧鈴,job和同步,適時使用高優先順序FCM訊息。對於另一小部分情況,這些還不夠。對這些情況,系統提供了一個可配置的白名單的功能,白名單中的應用不受Doze和應用待機的影響。

白名單中的應用可以在Doze或應用idle狀態使用網路或保持喚醒鎖。但其他限制依然適用。例如,白名單應用依然會被延遲job和同步(API 23及以上),常規AlarmManager的鬧鐘不會啟動。應用可以通過呼叫isIgnoringBatteryOptimizations()檢視自己是否在白名單。

使用者可以通過設定->電源->電池優化手動配置白名單。系統提供了幾種不同的方法讓使用者決定是否將某些應用加入白名單。

  • 應用可以傳送ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS intent,把使用者帶到電池優化及面,在這個介面,使用者可以把應用加入白名單。
  • 擁有REQUEST_IGNORE_BATTERY_OPTIMIZATION許可權的應用可以觸發一個系統對話方塊,讓使用者直接把該應用加入白名單,而不用進入設定介面。應用傳送ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATION intent觸發這個對話方塊。
  • 使用者可以手動將應用從白名單移除。

詢問使用者把你的應用加入白名單之前,請確保應用滿足白名單的可接受情況。

注意:Google Play的策略是禁止應用直接請求豁免Android6.0+的電源管理功能(Doze和應用待機),除非核心功能受很大影響。

測試Doze和應用待機

為了保證使用者體驗,應該在Doze和應用待機情況下對應用進行充分的測試。

測試Doze下的應用

通過下面的步驟對Doze進行測試:

  1. 裝載Android6.0或以上版本
  2. 連線裝置並安裝應用
  3. 執行應用使其進入啟用狀態
  4. 執行下面的命令強制系統進入idle

$ adb shell dumpsys deviceidle force-idle

  1. 準備好後,執行下面的命令退出idle
$ adb shell dumpsys deviceidle unforce
  1. 執行下面的命令重新啟用裝置
$ adb shell dumpsys battery reset
  1. 觀察重新啟用裝置後應用的行為,確保當裝置推出idle時應用行為合適。

用待機時測試應用

要在應用待機時測試應用:

  1. 裝載Android6.0或以上版本
  2. 連線裝置並安裝應用
  3. 執行應用使其進入啟用狀態
  4. 通過執行下面的命令,把應用設定成應用待機模式:
$ adb shell dumpsys battery unplug
$ adb shell am set-inactive <packageName> true
  1. 通過執行下面的命令,模擬喚醒應用:
$ adb shell am set-inactive <packageName> false
$ adb shell am get-inactive <packageName>
  1. 重新喚醒應用後觀察應用的行為。確保應用從待機模式恢復後反映合適。尤其是要檢查應用的通知和後臺job像期望的那樣工作。

可以白名單的情況

下表重點標出了可以白名單的情況。一般情況下,應用不應在白名單中,除非Doze或應用待機下核心功能受到很大影響或者由於技術原因不能使用高優先順序FCM訊息。

更多資訊,請看其他情況的支援。

型別

能否用FCM

可白名

即時訊息,聊天,電

需求是即時裝置處於Doze和應用待機模式下,也要給使用者實時消

是的,能用FCM

應該用高優先順序FCM訊息喚醒應用連線網路

是的,但沒用高優先順序FCM

即時訊息,聊天,電話;企業VOIP

不,不能用FCM,因為技術上使用了另一個訊息伺服器,或者Doze和應用待機影響了核心功能

 

自動化任務應

應用的基本功能是排程自動活動,例如即時訊息,語音呼叫,新圖象管理,位置活

如果可

 

外圍裝置配套程

應用的核心功能就是和外圍裝置保持連線並向外圍裝置提供網路連線

如果可

 

應用只需週期性的和外圍裝置進行同步或者應用只需要與外圍裝置,比如無線耳機,通過藍芽連上

如果可