Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android系統教程 >> 安卓省電與加速 >> Android 後台調度任務與省電詳解

Android 後台調度任務與省電詳解

編輯:安卓省電與加速

I. Handler:

在進程存活的期間有效使用, Google官方推薦使用。

簡單易用。

穩定高效。

II. AlarmManager:

利用系統層級的鬧鐘服務(持有Wake lock)。
如果需要精確的定時任務,這個是最佳選擇。

1. 功能

在大概的時間間隔 運行/重復執行 指定任務。

指定精確的時間間隔執行任務。

2. 特征

注冊以後,無論是自己的應用進程是否存在/組件是否存在,都會正常執行。

所有注冊的鬧鐘服務都會在系統重啟後復位,因此如果需要保證任務,就需要注冊RECEIVE_BOOT_COMPLETE,保證重啟後,可以重新將任務注冊到鬧鐘服務中。

AlarmManager處理的是一個PendingIntent,因此通常是啟動一個服務,進行處理事務。

3. 備注

官方不建議網絡請求相關的使用AlarmManager。

考慮到電量損耗,建議非特殊情況使用 大概時間的方式,這樣Android會盡量讓幾個任務打包在一起執行,防止頻繁的喚起手機。

III. Job Scheduler:

  1. JobScheduler官方文檔
  2. 建議網絡相關任務放到Job Scheduler。
  3. 系統重啟以後,任務會依然保留在Job Scheduler當中。
  4. 只有在Api21或以上的系統支持

1. 優勢

  1. 更節省電量
  2. 更高效
  3. 更易用

2. 明確的指定特定場景下執行(JobInfo):

由於是將多個任務打包在一個場景下執行,因此執行有略微的延後;並且有期限,如果在期限內還沒有滿足特定情況,系統會將這些任務加入隊列,並且隨後會進行執行。

  1. 設備開始充電
  2. 空閒
  3. 連接上網絡
  4. 斷開網絡

3. 接口類型

boolean onStartJob(JobParams params) {
  // 開始執行
  // 注意這個方法是在主線程執行的,如果是耗時操作請拋到獨立線程中
  // jobFinished(JobParameters params) // 在完成任務並且決定是否還需要定時執行更多任務
  // return 是否是在獨立現在還有事務要執行
}

void onStopJob(){
  // 用於清理數據,在結束任務後被回調。
}

IV. GCM

GCM Netwrok Manager實際上在 Api 21 或以上也是使用了 Job Scheduler,在此之前的版本使用的是Google Play Service中實

現Job Scheduler的功能。
在GCMNetworkManager中有很多利於省點的規則。

1. 接口類型

通過 OneoffTask.Builder()與PeriodicTask.Builder()創建任務。

GcmTaskService#onRunTask(TaskParams params)是在後台線程執行的。

觸發場景與JobInfo中的一樣。

V. Sync Adapter

Transferring Data Using Sync Adapters

通常是用於同步較多的數據。

也許這是Job Scheduler API 21前比較好的替代品。

同步服務端與本地設備中的數據。

1. 特征

  1. 利於大數據同步。
  2. 不需要依賴Google Play Service。
  3. 省電穩定。
  4. 用戶可以通過設置中主動查看同步的時間,以及觸發同步,或者關閉同步。
  5. API 7 或以上。

2. 備注

可綁定一個賬戶。

通過提供ContentProvider,並且與服務端同步的數據庫。

只有在存在網絡的時候才觸發同步。

2. 在一定的場景下觸發同步

盡可能的打包所有需要同步的任務在一個周期中執行,以此來進行盡可能的節省手機電量。

服務端/設備端數據發生變化。

手機閒置時。

一天。

如果同步失敗,會放到同步失敗的隊列中,在盡可能的時候進行同步。

VI. Doze Mode

Deep Doze Mode

API 23中直接稱其為Doze Mode。

無論Target SDK是多少,只要設備是Android API 23或以上會啟用該模式。

1. 特征

旨在: 在用戶離開設備以後,盡可能的減少手機電量的消耗。

開發人員並不需要做特殊的適配,但是會對上面提到的所有Schedule的方式(Job Scheduler、AlarmManager、Syncs Adapter)進行影響。

通過移動窗口打包任務請求,並且間隔時間會越來越久。

2. 進入條件

會同時滿足以下情況過後一段時間(大約30分鐘)以後生效:

手機沒有在充電

屏幕被關閉

手機各方狀態保持穩定

退出條件是,進入條件中任意條件狀態發生變化。

3. 在兩個處理窗口之間的手機狀態

  1. 對所有應用拒絕網絡訪問。
  2. 所有JobScheduler、Sync-Adapter、AlarmManager的任務都會被延後到窗口中執行。
  3. 系統會拒絕所有來自應用的WAKE-LOCK
  4. 停止所有Wifi以及GPS掃描
  5. 減少位置事件從設備檢測WiFi熱點。

Light Doze Mode

API 24 或以上會啟用該模式

1. 特征

相比Deep Doze Mode,打包任務的頻率會更高些

2. 進入條件

會同事滿足以下情況後一段時間(大約幾分鐘)以後生效:

手機沒有在充電

屏幕被關閉

處於穩定狀態/不穩定狀態

或者在以下的條件:

處於Deep Doze Mode

屏幕關閉

手機沒有在充電

手機不再處於穩定狀態

3. 退出條件

屏幕打開

手機開始充電

進入Deep Doze Mode

4. 在兩個處理窗口之間的手機狀態

對所有應用拒絕網絡訪問。

所有JobScheduler與Sync-Adapter的任務都會被延後到窗口中執行。

不會對AlarmManager中的任務進行影響,但是將無網絡訪問(如果你的任務需要網絡訪問,是時候改用JobScheduler或Sync-Adapter,保證在任務窗口執行會有網絡)

中斷/避開Doze

以下所有情況,Google官方都建議不在特殊情景,不要去使用,由於中斷了省電的規則。

1. AlarmManager

指定需要精確時間的事件: setAndAllowWhileIdle()、setExactAndAllowWhileIdle()。但是在非窗口期間並不解除無網絡訪問的限制,並且只有10s的時間給予處理。

指定鬧鐘事件AlarmManager.setAlarmClock()的事件會在鬧鐘結束前,令系統短暫的完全退出Doze模式,並且正常處理事件,系統為了突顯該鬧鐘事件,將會在status bar上顯示物理鬧鐘的icon。

2. FCM/GCM

(Firebase Cloud Messaging,舊版中稱為Google Cloud Messaging(GCM))。
FCM/GCM中高優先級的任務配置中("priority" : "high") 的消息,在Doze模式下可以正常及時到達。

3. 白名單

白名單官方文檔

官方建議可考慮加入白名單的情況

主動請求加入白名單,用戶同一以後加入白名單;

用戶也可以主動將App從白名單中刪除或添加應用;

應用可以通過isIgnoringBatteryOptimizations()來獲知是否在白名單中;

白名單的應用可以訪問網絡與持有有效的WAKELOKE,但是其他Doze的約束依然存在(如延後的Job Scheduler、Syncs-Adapter、AlarmManager);

名單的請求方式:

通過ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS打開電量優化頁面,用戶可以通過搜索來關閉應用的電量優化,以此加入白名單。

先持有REQUEST_IGNORE_BATTERY_OPTIMIZATIONS權限,然後通過啟動IntentACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS直接彈出Dialog讓用戶關閉應用的電量優化,以此加入白名單。

4. 特殊情況

前台服務(foreground-service)將不會受到Doze模式影響。

Doze模式測試

Google官方提供了一些adb命令用於測試Doze模式,而非需要通過等待來進入Doze模式的。

1. 進入Doze模式

准備一台系統是在Android Nougat Devloper Preview4或以上版本的設備。

將其連接連接到電腦。

通過 adb shell dumpsys battery unplug 命令讓設備進入未連接充電的模式。

通過 adb shell dumpsys deviceidle step [light|deep] 強行進入Doze模式。

退出Doze模式,讓手機恢復正常需要復位充電模式: adb shell dumpsys battery reset。

2. 其他指令

獲取設備狀態 adb shell dumpsys deviceidle get [light|deep|force|screen|charging|network]。

在Android Nougat Developer Preview 4中,Doze模式的狀態周期是:

Light: ACTIVE -> IDLE -> IDLE_MAINTENANCE -> OVERRIDE
Deep: ACTIVE -> IDLE_PENDING -> SENSING -> LOCATING -> IDLE -> IDLE_MAINTENANCE

Choosing the Right Background Scheduler in Android

Diving into Doze Mode for Developers

© 2012 – 2016, Jacksgong(blog.dreamtobe.cn). Licensed under the Creative Commons Attribution-NonCommercial 3.0 license (This license lets others remix, tweak, and build upon a work non-commercially, and although their new works must also acknowledge the original author and be non-commercial, they don't have to license their derivative works on the same terms). http://creativecommons.org/licenses/by-nc/3.0/

以上就是對Android 後台調度任務與省電的資料,有開發Android 應用的朋友可以參考下,謝謝大家對本站的支持!

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved