Android 后臺調(diào)度任務(wù)與省電詳解
I. Handler:
在進程存活的期間有效使用, Google官方推薦使用。
簡單易用。
穩(wěn)定高效。
II. AlarmManager:
利用系統(tǒng)層級的鬧鐘服務(wù)(持有Wake lock)。
如果需要精確的定時任務(wù),這個是最佳選擇。
1. 功能
在大概的時間間隔 運行/重復執(zhí)行 指定任務(wù)。
指定精確的時間間隔執(zhí)行任務(wù)。
2. 特征
注冊以后,無論是自己的應用進程是否存在/組件是否存在,都會正常執(zhí)行。
所有注冊的鬧鐘服務(wù)都會在系統(tǒng)重啟后復位,因此如果需要保證任務(wù),就需要注冊RECEIVE_BOOT_COMPLETE,保證重啟后,可以重新將任務(wù)注冊到鬧鐘服務(wù)中。
AlarmManager處理的是一個PendingIntent,因此通常是啟動一個服務(wù),進行處理事務(wù)。
3. 備注
官方不建議網(wǎng)絡(luò)請求相關(guān)的使用AlarmManager。
考慮到電量損耗,建議非特殊情況使用 大概時間的方式,這樣Android會盡量讓幾個任務(wù)打包在一起執(zhí)行,防止頻繁的喚起手機。
III. Job Scheduler:
- JobScheduler官方文檔
- 建議網(wǎng)絡(luò)相關(guān)任務(wù)放到Job Scheduler。
- 系統(tǒng)重啟以后,任務(wù)會依然保留在Job Scheduler當中。
- 只有在Api21或以上的系統(tǒng)支持
1. 優(yōu)勢
- 更節(jié)省電量
- 更高效
- 更易用
2. 明確的指定特定場景下執(zhí)行(JobInfo):
由于是將多個任務(wù)打包在一個場景下執(zhí)行,因此執(zhí)行有略微的延后;并且有期限,如果在期限內(nèi)還沒有滿足特定情況,系統(tǒng)會將這些任務(wù)加入隊列,并且隨后會進行執(zhí)行。
- 設(shè)備開始充電
- 空閑
- 連接上網(wǎng)絡(luò)
- 斷開網(wǎng)絡(luò)
3. 接口類型
boolean onStartJob(JobParams params) { // 開始執(zhí)行 // 注意這個方法是在主線程執(zhí)行的,如果是耗時操作請拋到獨立線程中 // jobFinished(JobParameters params) // 在完成任務(wù)并且決定是否還需要定時執(zhí)行更多任務(wù) // return 是否是在獨立現(xiàn)在還有事務(wù)要執(zhí)行 } void onStopJob(){ // 用于清理數(shù)據(jù),在結(jié)束任務(wù)后被回調(diào)。 }
IV. GCM
GCM Netwrok Manager實際上在 Api 21 或以上也是使用了 Job Scheduler,在此之前的版本使用的是Google Play Service中實
現(xiàn)Job Scheduler的功能。
在GCMNetworkManager中有很多利于省點的規(guī)則。
1. 接口類型
通過 OneoffTask.Builder()與PeriodicTask.Builder()創(chuàng)建任務(wù)。
GcmTaskService#onRunTask(TaskParams params)是在后臺線程執(zhí)行的。
觸發(fā)場景與JobInfo中的一樣。
V. Sync Adapter
Transferring Data Using Sync Adapters
通常是用于同步較多的數(shù)據(jù)。
也許這是Job Scheduler API 21前比較好的替代品。
同步服務(wù)端與本地設(shè)備中的數(shù)據(jù)。
1. 特征
- 利于大數(shù)據(jù)同步。
- 不需要依賴Google Play Service。
- 省電穩(wěn)定。
- 用戶可以通過設(shè)置中主動查看同步的時間,以及觸發(fā)同步,或者關(guān)閉同步。
- API 7 或以上。
2. 備注
可綁定一個賬戶。
通過提供ContentProvider,并且與服務(wù)端同步的數(shù)據(jù)庫。
只有在存在網(wǎng)絡(luò)的時候才觸發(fā)同步。
2. 在一定的場景下觸發(fā)同步
盡可能的打包所有需要同步的任務(wù)在一個周期中執(zhí)行,以此來進行盡可能的節(jié)省手機電量。
服務(wù)端/設(shè)備端數(shù)據(jù)發(fā)生變化。
手機閑置時。
一天。
如果同步失敗,會放到同步失敗的隊列中,在盡可能的時候進行同步。
VI. Doze Mode
Deep Doze Mode
API 23中直接稱其為Doze Mode。
無論Target SDK是多少,只要設(shè)備是Android API 23或以上會啟用該模式。
1. 特征
旨在: 在用戶離開設(shè)備以后,盡可能的減少手機電量的消耗。
開發(fā)人員并不需要做特殊的適配,但是會對上面提到的所有Schedule的方式(Job Scheduler、AlarmManager、Syncs Adapter)進行影響。
通過移動窗口打包任務(wù)請求,并且間隔時間會越來越久。
2. 進入條件
會同時滿足以下情況過后一段時間(大約30分鐘)以后生效:
手機沒有在充電
屏幕被關(guān)閉
手機各方狀態(tài)保持穩(wěn)定
退出條件是,進入條件中任意條件狀態(tài)發(fā)生變化。
3. 在兩個處理窗口之間的手機狀態(tài)
- 對所有應用拒絕網(wǎng)絡(luò)訪問。
- 所有JobScheduler、Sync-Adapter、AlarmManager的任務(wù)都會被延后到窗口中執(zhí)行。
- 系統(tǒng)會拒絕所有來自應用的WAKE-LOCK
- 停止所有Wifi以及GPS掃描
- 減少位置事件從設(shè)備檢測WiFi熱點。
Light Doze Mode
API 24 或以上會啟用該模式
1. 特征
相比Deep Doze Mode,打包任務(wù)的頻率會更高些
2. 進入條件
會同事滿足以下情況后一段時間(大約幾分鐘)以后生效:
手機沒有在充電
屏幕被關(guān)閉
處于穩(wěn)定狀態(tài)/不穩(wěn)定狀態(tài)
或者在以下的條件:
處于Deep Doze Mode
屏幕關(guān)閉
手機沒有在充電
手機不再處于穩(wěn)定狀態(tài)
3. 退出條件
屏幕打開
手機開始充電
進入Deep Doze Mode
4. 在兩個處理窗口之間的手機狀態(tài)
對所有應用拒絕網(wǎng)絡(luò)訪問。
所有JobScheduler與Sync-Adapter的任務(wù)都會被延后到窗口中執(zhí)行。
不會對AlarmManager中的任務(wù)進行影響,但是將無網(wǎng)絡(luò)訪問(如果你的任務(wù)需要網(wǎng)絡(luò)訪問,是時候改用JobScheduler或Sync-Adapter,保證在任務(wù)窗口執(zhí)行會有網(wǎng)絡(luò))
中斷/避開Doze
以下所有情況,Google官方都建議不在特殊情景,不要去使用,由于中斷了省電的規(guī)則。
1. AlarmManager
指定需要精確時間的事件: setAndAllowWhileIdle()、setExactAndAllowWhileIdle()。但是在非窗口期間并不解除無網(wǎng)絡(luò)訪問的限制,并且只有10s的時間給予處理。
指定鬧鐘事件AlarmManager.setAlarmClock()的事件會在鬧鐘結(jié)束前,令系統(tǒng)短暫的完全退出Doze模式,并且正常處理事件,系統(tǒng)為了突顯該鬧鐘事件,將會在status bar上顯示物理鬧鐘的icon。
2. FCM/GCM
(Firebase Cloud Messaging,舊版中稱為Google Cloud Messaging(GCM))。
FCM/GCM中高優(yōu)先級的任務(wù)配置中("priority" : "high") 的消息,在Doze模式下可以正常及時到達。
3. 白名單
白名單官方文檔
官方建議可考慮加入白名單的情況
主動請求加入白名單,用戶同一以后加入白名單;
用戶也可以主動將App從白名單中刪除或添加應用;
應用可以通過isIgnoringBatteryOptimizations()來獲知是否在白名單中;
白名單的應用可以訪問網(wǎng)絡(luò)與持有有效的WAKELOKE,但是其他Doze的約束依然存在(如延后的Job Scheduler、Syncs-Adapter、AlarmManager);
白
名單的請求方式:
通過ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS打開電量優(yōu)化頁面,用戶可以通過搜索來關(guān)閉應用的電量優(yōu)化,以此加入白名單。
先持有REQUEST_IGNORE_BATTERY_OPTIMIZATIONS權(quán)限,然后通過啟動IntentACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS直接彈出Dialog讓用戶關(guān)閉應用的電量優(yōu)化,以此加入白名單。
4. 特殊情況
前臺服務(wù)(foreground-service)將不會受到Doze模式影響。
Doze模式測試
Google官方提供了一些adb命令用于測試Doze模式,而非需要通過等待來進入Doze模式的。
1. 進入Doze模式
準備一臺系統(tǒng)是在Android Nougat Devloper Preview4或以上版本的設(shè)備。
將其連接連接到電腦。
通過 adb shell dumpsys battery unplug 命令讓設(shè)備進入未連接充電的模式。
通過 adb shell dumpsys deviceidle step [light|deep] 強行進入Doze模式。
退出Doze模式,讓手機恢復正常需要復位充電模式: adb shell dumpsys battery reset。
2. 其他指令
獲取設(shè)備狀態(tài) adb shell dumpsys deviceidle get [light|deep|force|screen|charging|network]。
在Android Nougat Developer Preview 4中,Doze模式的狀態(tài)周期是:
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 后臺調(diào)度任務(wù)與省電的資料,有開發(fā)Android 應用的朋友可以參考下,謝謝大家對本站的支持!
相關(guān)文章
android時間選擇控件之TimePickerView使用方法詳解
這篇文章主要為大家詳細介紹了android時間選擇控件之TimePickerView的使用方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-09-09Android實現(xiàn)從緩存中讀取圖片與異步加載功能類
這篇文章主要介紹了Android實現(xiàn)從緩存中讀取圖片與異步加載功能類,涉及Android針對緩存的操作及圖片異步加載相關(guān)實現(xiàn)技巧,需要的朋友可以參考下2016-08-08Android開發(fā)實現(xiàn)拍照功能的方法實例解析
這篇文章主要介紹了Android開發(fā)實現(xiàn)拍照功能的方法,結(jié)合實例形式較為詳細的分析了Android拍照功能的具體實現(xiàn)步驟與相關(guān)操作技巧,需要的朋友可以參考下2017-10-10