編輯:安卓省電與加速
I. Handler:
在進程存活的期間有效使用, Google官方推薦使用。
簡單易用。
穩定高效。
II. AlarmManager:
利用系統層級的鬧鐘服務(持有Wake lock)。
如果需要精確的定時任務,這個是最佳選擇。
1. 功能
在大概的時間間隔 運行/重復執行 指定任務。
指定精確的時間間隔執行任務。
2. 特征
注冊以後,無論是自己的應用進程是否存在/組件是否存在,都會正常執行。
所有注冊的鬧鐘服務都會在系統重啟後復位,因此如果需要保證任務,就需要注冊RECEIVE_BOOT_COMPLETE,保證重啟後,可以重新將任務注冊到鬧鐘服務中。
AlarmManager處理的是一個PendingIntent,因此通常是啟動一個服務,進行處理事務。
3. 備注
官方不建議網絡請求相關的使用AlarmManager。
考慮到電量損耗,建議非特殊情況使用 大概時間的方式,這樣Android會盡量讓幾個任務打包在一起執行,防止頻繁的喚起手機。
III. Job Scheduler:
1. 優勢
2. 明確的指定特定場景下執行(JobInfo):
由於是將多個任務打包在一個場景下執行,因此執行有略微的延後;並且有期限,如果在期限內還沒有滿足特定情況,系統會將這些任務加入隊列,並且隨後會進行執行。
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. 特征
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. 在兩個處理窗口之間的手機狀態
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 應用的朋友可以參考下,謝謝大家對本站的支持!
Nexus5手機各方面的配置都是很不錯的,不過不少用戶也發現這手機耗電也是很不正常的,這耗電問題影響很大,那麼要如
你也許還沒有注意到,Android 5.0 Lollipop版本統正式加入了電池保護模式。這一功能的引進,幫助Android用戶徹底告別了需要尋找第三方
手機越來越卡這種情況相信很多人都碰到過,甚至有些人在新買手機不久後就會察覺到這種情況,剛買手機是打開各個程序幾乎都是瞬間開啟,而現在點擊圖標後還要等上半秒或一
現在的智能手機既要追求輕薄,又要追求性能,一天一充基本成為大部分手機用戶的常態。眾所周知,電池已經成為了智能手機最大的硬件短板,類似於PC的機械硬盤,如今固態硬件已經解決