国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android 后臺調(diào)度任務(wù)與省電詳解

2019-12-12 05:32:03
字體:
供稿:網(wǎng)友

I. Handler:

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

簡單易用。

穩(wěn)定高效。

II. AlarmManager:

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

1. 功能

在大概的時間間隔 運行/重復(fù)執(zhí)行 指定任務(wù)。

指定精確的時間間隔執(zhí)行任務(wù)。

2. 特征

注冊以后,無論是自己的應(yīng)用進程是否存在/組件是否存在,都會正常執(zhí)行。

所有注冊的鬧鐘服務(wù)都會在系統(tǒng)重啟后復(fù)位,因此如果需要保證任務(wù),就需要注冊RECEIVE_BOOT_COMPLETE,保證重啟后,可以重新將任務(wù)注冊到鬧鐘服務(wù)中。

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

3. 備注

官方不建議網(wǎng)絡(luò)請求相關(guān)的使用AlarmManager。

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

III. Job Scheduler:

  1. JobScheduler官方文檔
  2. 建議網(wǎng)絡(luò)相關(guān)任務(wù)放到Job Scheduler。
  3. 系統(tǒng)重啟以后,任務(wù)會依然保留在Job Scheduler當中。
  4. 只有在Api21或以上的系統(tǒng)支持

1. 優(yōu)勢

  1. 更節(jié)省電量
  2. 更高效
  3. 更易用

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

由于是將多個任務(wù)打包在一個場景下執(zhí)行,因此執(zhí)行有略微的延后;并且有期限,如果在期限內(nèi)還沒有滿足特定情況,系統(tǒng)會將這些任務(wù)加入隊列,并且隨后會進行執(zhí)行。

  1. 設(shè)備開始充電
  2. 空閑
  3. 連接上網(wǎng)絡(luò)
  4. 斷開網(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. 特征

  1. 利于大數(shù)據(jù)同步。
  2. 不需要依賴Google Play Service。
  3. 省電穩(wěn)定。
  4. 用戶可以通過設(shè)置中主動查看同步的時間,以及觸發(fā)同步,或者關(guān)閉同步。
  5. 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)

  1. 對所有應(yīng)用拒絕網(wǎng)絡(luò)訪問。
  2. 所有JobScheduler、Sync-Adapter、AlarmManager的任務(wù)都會被延后到窗口中執(zhí)行。
  3. 系統(tǒng)會拒絕所有來自應(yīng)用的WAKE-LOCK
  4. 停止所有Wifi以及GPS掃描
  5. 減少位置事件從設(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)

對所有應(yīng)用拒絕網(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從白名單中刪除或添加應(yīng)用;

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

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

名單的請求方式:

通過ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS打開電量優(yōu)化頁面,用戶可以通過搜索來關(guān)閉應(yīng)用的電量優(yōu)化,以此加入白名單。

先持有REQUEST_IGNORE_BATTERY_OPTIMIZATIONS權(quán)限,然后通過啟動IntentACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS直接彈出Dialog讓用戶關(guān)閉應(yīng)用的電量優(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模式,讓手機恢復(fù)正常需要復(fù)位充電模式: 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

主站蜘蛛池模板: 七台河市| 桐柏县| 盖州市| 滦南县| 德庆县| 县级市| 广汉市| 石嘴山市| 江阴市| 来安县| 巴彦县| 延吉市| 平塘县| 承德县| 久治县| 仲巴县| 黎川县| 双辽市| 会东县| 射阳县| 兰州市| 额济纳旗| 钟祥市| 大足县| 安顺市| 会理县| 桃源县| 万源市| 拜城县| 容城县| 遵化市| 红安县| 镇平县| 九江市| 阿鲁科尔沁旗| 五原县| 灵丘县| 抚州市| 肥西县| 柳林县| 永安市|