Android M新特性Doze and App Standby模式詳解

2015-11-06 timor      QQ空間終端開發團隊 QQQQQjiad  ad點擊打開鏈接
aaas
zhana

Optimizing for Doze and App Standby 

1.Android6.0開始,Android提供了兩種省電延長電池壽命的功能:DozeApp Standby;

2.表現形式:當設備沒有連接到電源,設備進入Doze模式時,系統將通過延遲最近用戶沒有使用的應用程序的後臺CPU運作及網絡活動,讓應用程序處於App Standby狀態,以此來減少電池消耗。谷歌表示,在Nexus5Nexus6上測試,當屏幕處於關閉狀態,平均續航時間提高30%;

3.版本要求:Android6.0API level 23)及其更高版本;

4.開發者影響:爲了保證用戶的最佳體驗,開發者有必要在DozeApp Standby模式下測試應用程序,及其對代碼進行相應的調整。


Understanding Doze

1.設備進入Doze睡眠模式時機:

  • 用戶不操作設備一段時間

  • 屏幕關閉

  • 設備未連接電源充電

2.Doze模式下應用程序有什麼變化:

  • 系統試圖通過限制應用程序訪問網絡和CPU密集型服務節省電池;

  • 防止應用程序訪問網絡,推延應用程序的工作,同步,和標準的警報;

  • 系統定期提供一個短暫的時間讓應用程序完成延遲的工作活動,在這個時間片裏,系統將提供維持性窗口應用程序訪問網絡,運行在等待的同步,工作,和報警等活動。

Doze模式的五種狀態,分別如下:

ACTIVE:手機設備處於激活活動狀態

INACTIVE:屏幕關閉進入非活動狀態

IDLE_PENDING:每隔30分鐘讓App進入等待空閒預備狀態

IDLE:空閒狀態

IDLE_MAINTENANCE:處理掛起任務

如下圖所示,Doze期間提供間隔一小段時間(30s)供應用程序使用網絡和處理掛起的活動。

從這張圖我們可以看到,系統進入Doze模式後,系統會隔一段時間處理正在掛起的任務,隨着時間推移,後面間隔的時間會越來越長,以此來減少電量消耗。

3.退出Doze模式(系統退出休眠,所有的應用程序恢復正常活動):

  • 用戶喚醒裝置移動,打開屏幕

  • 或者設備連接電源

4.Doze有哪些限制?

  • 網絡連接會被禁止

  • Wake Lock會被屏蔽

  • AlarmManager定時任務延遲到下一個maintenance window進行處理,除非使用AlarmManager提供的方法:setAndAllowWhileIdle()或者setExactAndAllowWhileIdle()

  • 系統將不掃描熱點WIFI

  • 同步工作將被禁止

  • 不允許JobScheduler進行任務調度

5.適配Doze模式有什麼方法?

  • Doze影響到AlarmManager鬧鐘和定時器管理活動,在Android6.0引入了兩個新方法:setAndAllowWhileIdle()setExactAndAllowWhileIdle(),調用兩個方法可以在Doze模式下讓系統響應定時任務

  • Doze模式下限制了網絡的連接,如果應用程序依賴於實時信息,那麼這個將影響App的體驗。那麼你需要使用Google Cloud Messaging (GCM)谷歌雲消息(後面詳細講解)

6.測試DozeApp Standby模式的方法(Adb命令)

  • 測試Doze模式

1. 首先確保你的硬件或虛擬設備是Android6.0或更高版本系統;

2. 連接設備到開發機上並安裝你的app;

3.運行app並讓其運行活動;

4. 關閉設備的屏幕;

5. 運行以下adb命令使系統進入Doze模式:

$ adb shell dumpsys battery unplug

$ adb shell dumpsys deviceidle step

6. 觀察你的app表現行爲是否有需優化改進的地方。

  • 測試App Standby模式

步驟1-3同測試Doze模式

4. 運行以下adb命令迫使系統進入App Standby模式:

$ 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.觀察你的App,確保應用程序恢復正常從待機模式過程中,App的通知及其背部活動能達到預期結果。


Understanding App Standby

當用戶不觸摸使用應用程序一段時間時,該應用程序處於App Standby狀態,系統將把該App標誌爲空閒狀態。除非觸發以下任意條件,應用程序將退出App Standby狀態:

1.用戶主動啓動該App;

2.App當前有一個前臺進程(或包含一個活動的前臺服務,或被另一個activity或前臺service使用);

3.App生成一個用戶所能在鎖屏或通知托盤看到的Notification,而當用戶設備插入電源時,系統將會釋放App的待機狀態,允許他們自由的連接網絡及其執行未完成的工作和同步。如果設備空閒很長一段時間,系統將允許空閒App一天一次訪問網絡。

DozeApp Standby的區別:

Doze模式需要屏幕關閉(通常晚上睡覺或長時間屏幕關閉纔會進入),而App Standby不需要屏幕關閉,App進入後臺一段時間也會受到連接網絡等限制。


Using GCM to Interact with Your App While the Device is Idle

1.什麼是GCM?

Google Cloud Messaging(GCM)是一個雲到設備的服務,可以讓你支持實時在雲端服務和Android設備上應用程序之間的消息傳遞。

GCM提供了一個持久連接到雲端的鏈接,讓所有需要實時消息傳遞應用程序可以共享此鏈接。這個共享鏈接顯著優化電池消耗,使其不必讓多個應用程序各位維護自己單獨的持久鏈接而使電池迅速耗盡。

由於這個原因,官方建議:如果你的應用需要消息傳遞與後端服務集成,我們強烈建議儘可能的使用GCM,而不是單獨維護自己的網絡鏈接。

GCM消息擁有高優先級,不影響Doze模式,且不會不影響其他應用程序的狀態。這意味着你的應用程序可以使用它們進行通信,同時最大限度地減少電池在整個系統和設備的影響。

以下來GCM自官方解釋:

一個GCM實現包括谷歌連接服務器,在你的環境中通過HTTPXMPP協議的連接服務器進行交互的應用程序服務器和客戶端應用程序。


生命週期流程:

  • 註冊啓用GCM:客戶端應用程序註冊爲接收消息。

  • 發送和接收下行消息:

發送一個消息,該應用程序服務器發送信息到客戶端應用程序:

1.該應用程序服務器發送消息給GCM連接服務器;

2.當設備處於脫機狀態,該GCM連接服務器入隊並存儲消息;

3.當設備聯機時,GCM連接服務器將郵件發送到該設備;

4.在設備上,所述客戶端應用程序根據該特定平臺實現接收該消息。

接收消息,客戶端應用程序收到一條消息從GCM連接服務器。

  • 發送和接收上游的消息:如果您使用的是此功能只提供XMPP連接服務器

發送一個消息,客戶端應用程序將消息發送到應用服務器:

1.在設備上,客戶端應用程序將消息發送到XMPP連接server;

2.如果該服務器已斷開連接,該XMPP服務器連接入隊並存儲信息;

3.當應用程序服務器重新連接後,XMPP連接服務器將郵件發送到應用程序服務器。

接收消息,一個應用服務器從XMPP連接服務器接收郵件,然後執行以下操作:

1、解析消息頭,以驗證客戶端應用程序發送的信息;

2、發送“確認”的XMPP連接服務器以確認收到該消息;

3、任選解析該消息有效載荷,由客戶端應用程序所定義的。

除了GCMAndroid6.0及更高版本還提供了Doze模式白名單列表,通過設置應用程序進入白名單列表可逃脫Doze模式的各種限制。

檢測應用程序是否存在白名單list裏面,可使用PowerManagerisIgnoringBatteryOptimizations()方法。

用戶也可手動設置應用程序進入白名單列表裏面,路徑爲:設置>電池>電池優化白名單:

客戶端使用方法:

1.App程序可發送actionACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGSintent引導用戶進入設置界面將應用程序設置進白名單列表裏。

2.應用程序還可以使用AREQUEST_IGNORE_BATTERY_OPTIMIZATIONS權限來觸發一個系統對話來讓用戶添加到白名單裏,而無需進入設置界面去設置。

當然,官方也提供用戶把你的App移除電池優化白名單的選項。這個白名單也會被Android M的另一個新特性 App Standby使用,所以用戶只能簡單的進行控制,也就是說設備並不會完全相信這個白名單。

官方舉了一下白名單例子:


$ adb shell dumpsys deviceidle whitelist +<packageName>

$ adb shell dumpsys deviceidle



總結:

Doze模式的推出本身是爲了減少電池的消耗,且Google希望統一使用GCM來傳遞消息進行通訊,而對於國內開發來講,確實帶來了很大的麻煩:

1.國內開發的一些消息推送機制(PUSH)將受到影響;

2.若使用GCM,在國內使用GCM延遲高,對於即時通訊產品來說選擇還需勇氣啊;

3.國內第三方手機廠商如華爲、小米、三星,定製的Rom也將使用定製的推送消息機制。這讓同一款App如何選擇哪種推送機制才能兼容呢?

解決方法:

1.用戶添加應用程序到電池優化白名單列表;

2.開發者使用Google提供的ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS意圖和AREQUEST_IGNORE_BATTERY_OPTIMIZATIONS權限設置以此忽略(推薦);

3.使用Google提供的GCM;

4.通過so繞過Doze模式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章