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:

JobScheduler官方文檔

建議網絡相關任務放到Job Scheduler。

系統重啟以後,任務會依然保留在Job Scheduler當中。

只有在Api21或以上的系統支持

1. 優勢

  • 更節省電量
  • 更高效
  • 更易用

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. 特征

  • 利於大數據同步。
  • 不需要依賴Google Play Service。
  • 省電穩定。
  • 用戶可以通過設置中主動查看同步的時間,以及觸發同步,或者關閉同步。
  • 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/

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