Android 後臺調度任務與省電

2021-03-06 開發者全社區

相關閱讀:

吊炸天!74款APP完整源碼!

絕對乾貨-國內值得關注的官方API集合,很全很強大(必須收藏)

[乾貨]2017已來,最全面試總結——這些Android面試題你一定需要


來源:龔振傑  

https://blog.dreamtobe.cn/2016/08/15/android_scheduler_and_battery/

I. Handler:

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

相關機制可以參見: Android Handler Looper機制

II. AlarmManager:

利用系統層級的鬧鐘服務(持有Wake Lock)。

1. 使用場景

在大概的時間間隔(重複)運行指定任務。

在精確的時間間隔(重複)運行指定任務。

2. 特徵

運行在系統的鬧鐘服務上的,註冊以後,無論是自己的應用進程或組件是否存在,都會正常運作。

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

AlarmManager處理的是一個PendingIntent。

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

III. Job Scheduler:

JobScheduler官方文檔

1. 使用場景

在指定特定場景下執行指定任務

2. 特徵

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

Job Scheduler是將多個任務打包在一個場景下執行。

在系統重啟以後,任務會依然保留在Job Scheduler當中,因此不需要監聽系統啟動狀態重複設定。

如果在一定期限內還沒有滿足特定執行所需情況,Job Scheduler會將這些任務加入隊列,並且隨後會進行執行。

3. 接口類型

boolean onStartJob(JobParams params) {

    // 開始執行

    // 注意這個方法是在主線程執行的,如果是耗時操作請拋到獨立線程中

    // jobFinished(JobParameters params) // 在完成任務並且決定是否還需要定時執行更多任務

    // return 是否是在獨立現在還有事務要執行

}

 

void onStopJob(){

    // 用於清理數據,在結束任務後被回調。

}

IV. GCM(FCM)

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

在GCMNetworkManager中有很多利於省電的規則。

在中國內地,該服務被牆,無法正常使用。

1. 使用場景

2. 特徵

系統級別維護的長連結,十分穩定。

3. 接口類型

V. Sync Adapter

Transferring Data Using Sync Adapters

1. 使用場景

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

2. 特徵

省電穩定。

可綁定一個帳戶。

利於大數據同步。

通過提供ContentProvider,可以快捷的與服務端同步的資料庫。

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

不需要依賴Google Play Service。

用戶可以通過設置中主動查看同步的時間,以及觸發同步,或者關閉同步。

Sync Adapter在API7或以上就可以使用,因此在一些場景下這是Job Scheduler在API21之前比較好的替代品。

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

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

VI. Doze Mode

Deep Doze Mode

API23中直接稱其為Doze Mode。

1. 特徵

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

所有任務周期通過移動窗口打包任務執行,並且間隔時間會越來越久。

2. 進入條件

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

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

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

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

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

系統會拒絕所有來自應用的Wake Lock

停止所有Wifi以及GPS掃描

減少位置事件從設備檢測WiFi熱點。

Light Doze Mode

Android 7或以上會啟用該模式。

1. 特徵

2. 進入條件

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

或者在Deep Doze Mode的情況下同時滿足以下條件下生效:

3. 退出條件

屏幕打開

手機開始充電

進入Deep Doze Mode

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

中斷/避開Doze

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

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. 白名單

白名單官方文檔

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

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

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

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

白名單的應用可以訪問網絡與持有有效的Wake Lock,但是其他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 Developer Preview4或以上版本的設備。

將其連接連接到電腦。

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

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

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

2. 其他指令

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

Light: ACTIVE -> IDLE -> IDLE_MAINTENANCE -> OVERRIDE

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

Java和Android大牛頻道

歡迎關注我們,一起討論技術,掃描和長按下方的二維碼可快速關注我們。或搜索微信公眾號:JANiubility。

公眾號:JANiubility

相關焦點

  • 關閉 iOS 後臺程序會讓 iPhone 更省電嗎?
    對於很多的 iPhone 用戶來說,可能都會認為關閉後臺程序可以讓設備的速度變得更快,或者是更省電,在很多關於 iPhone 省電技巧類的文章中都會提到,關閉 iOS 後臺程序是幫助設備省電最直接的方法。但是,關閉 iOS 後臺程序真的會讓 iPhone 更省電嗎?我們先來看 iOS 系統的運作模式。
  • android 從後臺啟動頁面專題及常見問題 - CSDN
    這三個Tesseract語言包合起來約有70M左右,APK文件中拷貝語言包到手機存儲中需要幾秒時間,所以我們做了一個啟動頁面,在為用戶展示App第一印象的同時,後臺拷貝這三個語言包。經過比較,知乎日報的啟動頁面有從中心點展開逼進用戶的效果,我們決定利用此效果來設計啟動頁面。最終效果如圖所示:
  • Android 5.0如何開啟省電模式?Android 5.0如何省電?
    Android 5.0如何開啟省電模式?Android 5.0如何省電?  你也許還沒有注意到,Android 5.0 Lollipop版本統正式加入了電池保護模式。這一功能的引進,幫助Android用戶徹底告別了需要尋找第三方應用程式來延長續航時間的尷尬日子。
  • 如何讓你的App永遠在後臺存活:對Android進程守護、鬧鐘後臺被殺死的研究
    但是,我們知道,android系統很坑爹,不同的廠商對rom的定製,導致對進程的管理都不太相同,但是如何做到在各個手機上都能一直保持後臺執行呢?。為了解決這個問題,特地去研究了各種保持進程不被殺死的方法。下面對幾種常見的用法進行了分析,並且給出了我自己發現的一個保持進程運行的方法。
  • Android Systrace 基礎知識(12) - Kernel_CPU Info 解讀
    對應的 Kernel 中的 CPU Info 區域(底下的一些這裡不講,主要是講 Kernel CPU 信息)CPU 區域圖例Systrace 中 CPU Info 一般在最上面,裡面經常會用到的信息包括:總的來說,Systrace 中的 Kernel CPU Info 這裡一般是看任務調度信息
  • 車輛調度
    2.調度任務:你為啥會調度車輛,肯定要有一個任務 3.客戶:那這個車輛為誰調度呢? 4.用戶:誰創建了這個任務,並且發起了調度,或者是誰主導了這個任務   這些問題弄清楚之後,我們就可以想像一下這個流程了   客戶發起了一個調度任務,用戶去調度車輛執行這個任務,然後接到任務的調度車輛去完成這個任務。完成任務之後,客戶接收到任務完成之後的結果,大功告成。
  • 小米手機省電設置方法
    三、電量和性能:打開設置--電量和性能,分為:省電優化、運用配置、場景配置、溫控和性能模式,省電優化模塊,裡面分為:省電模式、運用智能省電、自動任務三個主項目,分別設置,省電模式可以直接打開,或者設置為電量降到多少時自動打開或者定時打開。
  • Android 10 適配攻略,你適配了嗎?
    單次權限即將到來)1.在後臺運行時訪問設備位置信息需要權限Android 10 引入了 ACCESS_BACKGROUND_LOCATION 權限(危險權限)。<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>該權限允許應用程式在後臺訪問位置。如果請求此權限,則還必須請求ACCESS_FINE_LOCATION 或 ACCESS_COARSE_LOCATION權限。只請求此權限無效果。
  • Android四大組件知識點總結
    android:theme=」@android:style/Theme.Dialog」談談onSaveInstanceState()方法?何時會調用?在清單文件下每個activity註冊時寫上android:configChanges=「XXX」比如橫豎屏切換:android:configChanges=「orientation」優先級低的Activity在內存不足被回收後怎樣做可以恢復到銷毀前狀態?Task和Activity棧以及相應的Intent和數據會被系統保存起來。
  • 5 分鐘教你上手這個神器 App,讓你的 Android 更流暢省電
    與 iOS 由系統集中統一對應用進行後臺管理的機制不同,Android 上的後臺機制更加開放透明,這就給了許多「毒瘤」應用可乘之機:常駐後臺、互相喚醒,既拖慢設備的運行速度,又極大地影響手機續航。
  • 幾種任務調度的 Java 實現方法與比較
    本文由淺入深介紹了幾種任務調度的 Java 實現方法,包括 Timer,Scheduler, Quartz 以及 JCron Tab,並對其優缺點進行比較,目的在於給需要開發任務調度的程式設計師提供有價值的參考。 前言 任務調度是指基於給定時間點,給定時間間隔或者給定執行次數自動執行任務。
  • Android開發:AsyncTask的原理
    核心方法調用時機執行線程 onPreExecute 後臺任務執行前,自動調用UI線程doInBackground後臺任務執行時,自動調用工作線程onProgressUpdate當手動調用publishProgress方法時UI線程onPostExecute後臺任務執行結束時,自動調用UI線程
  • 魅族Flyme One Mind,後臺待機純淨省電,米粉詫異:還有這種操作
    這一次,Flyme 7在性能、功能等方面又進行了進一步的優化提升,色彩細膩,貼心交互,無縫化動畫設計,細節的出彩設計讓體驗更加流暢,尤其是在One Mind的加持下更是如虎添翼,不僅流暢度爆棚並且後臺待機純淨省電,說Flyme是最流暢的安卓定製系統也不為過。
  • CFS:調度時延/調度最小搶佔粒度/調度喚醒搶佔粒度詳解
    一、概述在之前的文章進程調度概述以及性能debug方法概述 裡面,在CFS 調度器章節講解了理想運行時間
  • XXL-JOB v2.1.0 發布,分布式任務調度平臺
    >3、調度中心HA(中心式):調度採用中心式設計,「調度中心」自研調度組件並支持集群部署,可保證調度中心HA; 4、執行器HA(分布式):任務分布式執行,任務"執行器"支持集群部署,可保證任務執行HA; 5、註冊中心: 執行器會周期性自動註冊任務, 調度中心將會自動發現註冊的任務並觸發執行。
  • 3千字帶你搞懂XXL-JOB任務調度平臺
    ,有一些場景需要分布式任務調度:同一個服務多個實例的任務存在互斥時,需要統一的調度。任務調度需要支持高可用、監控、故障告警。需要統一管理和追蹤各個服務節點任務調度的結果,需要記錄保存任務屬性信息等。xxl-job則相反,是通過一個中心式的調度平臺,調度多個執行器執行任務,調度中心通過DB鎖保證集群分布式調度的一致性,這樣擴展執行器會增大DB的壓力,但是如果實際上這裡資料庫只是負責任務的調度執行。但是如果沒有大量的執行器的話和任務的情況,是不會造成資料庫壓力的。實際上大部分公司任務數,執行器並不多(雖然面試經常會問一些高並發的問題)。
  • java任務調度之Timer定時器(案例和源碼分析)
    不過我們需要注意一點的是,Timer在構造完成之後會啟動一個後臺線程用於執行TaskQueue裡面的TimerTask 。3、定時任務方法在一開始我們提到,我們不僅可以在指定的時間執行某些任務,還可以在一段時間之後執行。
  • XXL-JOB v1.6.0 發布,分布式任務調度平臺
    ;9、GLUE模式任務實例更新邏輯優化,原根據超時時間更新改為根據版本號更新,源碼變動版本號加一;《分布式任務調度平臺XXL-JOB》一、簡介1.1 概述XXL-JOB是一個輕量級分布式任務調度框架,其核心設計目標是開發迅速、學習簡單、輕量級、易擴展。
  • opencron v1.0.1 發布,分布式任務調度系統
    opencron 是一個功能完善且通用的開源定時任務調度系統,擁有先進可靠的自動化任務管理調度功能,提供可操作的web圖形化管理滿足多種場景下各種複雜的定時任務調度
  • Android 代碼規範文檔
    後臺返回的金額數值應該使用 String 來接收,而不能用浮點數來接收,因為 float 或者 double 在數值比較大的時候會容易丟失精度,並且還需要自己手動轉換出想要保留的小數位,最好的方式是後臺返回什麼前端就展示什麼,而到了運算的時候,則應該用 BigDecimal 類來進行轉換和計算,當然金額在前端一般展示居多,運算的情況還算是比較少的。