使用JobSchedule對任務進行合理排期
JobSchedule 是 Android 5.0之後新增進去的, 之前的版本沒有.
JobSchedule 原理是一種將任務安排在恰當的實際進行操作一種方案機制. 具體提供了那些可選的時機, 如下:
- 在可用網路下執行. 在7.0 之前, 應用可以通過監聽網路變化來執行任務, 當然了前提是應用必須存活. 7.0之後這類API已經失效, 而JobSchedule機制提供了網路變化的監聽. 進一步可以在網路變化的情況下執行某些操作. 例如在wifi環境下執行下載任務等.
- 裝置在充電或者空閒時執行一些任務.
- 設定執行的時間, 這個和上述兩條條件一起使用.
具體的實現如下:
1 任務排期
//獲取 JobScheduler 例項
final JobScheduler scheduler = context.getSystemService(JobScheduler.class);
//或者
final JobScheduler scheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE );
//構建JobInfo jobId 為jobID. BusinessService 為Job接受的Service, 該Service必須繼承JobService
final JobInfo.Builder builder = new JobInfo.Builder(jobId, new ComponentName(context, BusinessService.class));
//設定裝置重啟是執行此任務. 前提是需要擁有RECEIVE_BOOT_COMPLETED 許可權
builder.setPriority(JobInfo.PRIORITY_FOREGROUND_APP);
//這個設定並不能設定成為前臺程序. 通知還需要應用自己發. 此外該設定會忽略該任務的網路限制.
builder.setFlags(JobInfo.FLAG_WILL_BE_FOREGROUND);
//設定任務延遲執行時間, 不可與setPeriodic(long time)同時使用
builder.setMinimumLatency (time);
//設定裝置執行的網路條件JobInfo.NETWORK_TYPE_UNMETERED 不計量網路(wifi), JobInfo.NETWORK_TYPE_NOT_ROAMING 非漫遊網路, NETWORK_TYPE_ANY任何網路
//JobInfo.NETWORK_TYPE_NONE 無論是否有網路都執行
builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED);
//設定在裝置充電時執行
builder.setRequiresCharging(true);
//設定在裝置空閒時間執行
builder.setRequiresDeviceIdle(true);
//迴圈每5秒執行一次
builder.setPeriodic(5000);
//約定的時間內的條件都沒有被觸發是5秒以後開始觸發
builder.setOverrideDeadline(5000);
//生成Job
JobInfo job = builder.build();
//安排Job, 該方法有返回值 JobScheduler.RESULT_SUCCESS 表示安排成功, JobScheduler.RESULT_FAILURE 安排失敗
scheduler.schedule(job)
//如果當前的jobId已經被安排了則下取消該安排
final int jobId = (int) info.mId;
scheduler.cancel(jobId);
//安排Job, packageName 表示那個應用安排的Job(耗電記這個應用的). userId表示誰安排的Job
scheduler.scheduleAsPackage(builder.build(), packageName, UserHandle.myUserId(), TAG);
2 處理任務.
當任務安排下去, 應該會被記錄在JobScheduler服務裡面. 當條件滿足時, 處理job對應的JobService會被啟動, 否則…
首先配置和定義JobService
<service
android:name=".BusinessService"
android:exported="true" //這個地方必須是true, 否則外界的應用無法啟動該JobService
android:permission="android.permission.BIND_JOB_SERVICE" //必須定義這個許可權
/>
public class BusinessService extends JobService {
//開始執行Job介面. (必須實現)如果返回false則表示這個Job已經被執行完畢. 如果true則表示這個Job正在被執行.
public boolean onStartJob(JobParameters params) {
final int id = params.getJobId();
//....開始執行Job
//1 對於一個瞬間能夠完成的任務, 此處可以return false.
//2 如果是耗時任務, 則需要在非同步執行緒中執行, 並且返回true. 此外執行完後不要忘記執行jobFinished
myHandler.removeMessages(id);
myHandler.sendEmptyMessage(id);
}
//Job執行停止, 必須實現, 當接收到任務取消時, 如果該任務沒有被結束, 則執行該方法, 否則不執行.
public boolean onStopJob(JobParameters params) {
//此處可以重新安排被取消的任務.
scheduler.schedule(job)
}
//還有一個方法. jobFinished(JobParameters params, boolean needsRescheduled) 該方法是在任務執行完成時通知系統(不代表任務被執行成功). needsRecheduled表示該任務是否被重複執行.
//例如onStartJob執行結果是true. 則實際上任務還在執行.
//如果這時候任務執行完了. 就必須呼叫這個方法否則後面的任務無法進行.
}
總結, Scheduler是一套提供給開發者的一套優化耗電的任務安排方式.
相關推薦
使用JobSchedule對任務進行合理排期
JobSchedule 是 Android 5.0之後新增進去的, 之前的版本沒有. JobSchedule 原理是一種將任務安排在恰當的實際進行操作一種方案機制. 具體提供了那些可選的時機, 如下: 在可用網路下執行. 在7.0 之前, 應用可以通
Java 通過Future來對任務進行取消
本節我們將通過Java中的Future實現對於提交的任務進行取消。ExecutorService.submit將返回一個Future來描述任務,Future擁有一個cancel方法,該方法帶有一個boolean型別的引數mayInterruptIfRunning,
如何對網站關鍵詞進行合理布局?
之前 不能 影響 borde 其他 帶來 得到 網站seo 比較 網站關鍵詞優化是做網站seo優化的至關重要的步驟,如果你網站的關鍵詞布局、關鍵詞運營、關鍵詞設置、關鍵詞挑選沒有做好,那樣會導致你後期優化效果乏力,不能得到理想的優化成效。所以網站關鍵詞優化不單單只是簡單的挑
應用結構體對二維陣列的大小進行快排
之前一直不會結構體,今天就簡單的學了一下,對陣列a[n][m]進行從大到小進行排序(n*m<=1e8),輸出座標,由於陣列比較大,用快排進行排序。下面就以簡單的a[3][3]為例。 #include<iostream>
蠻力法,對一組資料先進行快排,再找出眾數
環境 :Windows10, VS2010 #include <iostream> #include <string> using namespace std; int Partition (int r[],int first,int end)
使用容器和Elasticsearch集群對Twitter進行監控
docker rancher 集群 twitter 監控 介紹Elasticsearch是ELK(Elasticsearch/Logstash/Kibana)的基石。在這篇文章中,我們將使用Rancher Catalog來部署stack,並將它用於追蹤Twitter上的tag和brand。
安卓端通過http對Mysql進行增刪改查
name 交流 shm != 用戶 習慣 cti -perm 得到 各類it學習視頻,大家都可以看看哦!我自己本人都是通過這些來學習it只知識的! 下面是視頻鏈接轉自:http://www.cnblogs.com/wangying222/p/5492935.html ht
sql語句對列進行操作
tmp from num table 數據 code pda odi com 1 create table test_1( 2 tname number(20), 3 tage varchar2(1024), 4 tmessage varchar(1024)
python3 簡單實現從csv文件中讀取內容,並對內容進行分類統計
tmp spa writer ict 打開文件 while 類型 spl blog 新手python剛剛上路,在實際工作中遇到如題所示的問題,嘗試使用python3簡單實現如下,歡迎高手前來優化import csv #打開文件,用with打開可以不用去特意關閉file了
根據對象的屬性排序數組
cccccc clas pro func sort class var prop cti 根據對象的年齡排序。 var boy = [{ name: "jiang", age: 22 }, { name: "
C#中對DataTable進行全連接後group by,orderby
orderby utime mp3 var c# put enume enum solver var result = from temp2 in ( f
學習4 對縮寫進行標記
logs style con 放棄 code 學習 clas itl htm <!doctype html> <html> <body style="background-color:#55EBED"> <p>一個<d
java對圖片進行透明化處理
bsp code 1.5 round imageio class public 判斷 icon 1 package utils; 2 3 import java.awt.Graphics2D; 4 import java.awt.image.BufferedI
cacti開發模板對主機進行監測
cacti自定義模板 接著上篇博文cacti配置安裝,接下來在講一下對cacti自主開發模板的一些操作。登錄自己設置好的虛擬主機,在上一篇中,我設置的虛擬主機為 cacti.gaowei.com。第一次登錄的時候,會提示你安裝cacti,按照提示的一步一步來就可一了,默認的用戶名和密碼是admin和 a
用block變量來對字符數組對象進行排序
mil 升序 進行 mutable ted ear string sorted hit <span style="font-size:18px;">降序排序</span><span style="font-
python_如何對字典進行排序?
反轉 abc import 通過 item abcd mic 先後 true 案例: 某班英語成績以字典的形式存儲為: {‘lili’:78, ‘jin’:50, ‘liming’: 30, ......} 依據成績高低,進行
Python—對Excel進行讀寫操作
href ace 需要 文件中 tle net 過程 ova 設置 學習Python的過程中,我們會遇到Excel的讀寫問題。通過搜索得知,我們可以使用xlwt module將數據寫入Excel表格,使用xlrd module從Excel讀取數據。下面介紹如何實現使用pyt
使用手勢對UIImageView進行縮放、旋轉和移動
nbsp boa use itl ans self. iges comm title [cpp] view plain copy // 添加所有的手勢 - (void) addGestureRecognizerToView:(UIView *)view
在LinuxMint中對firefox進行手動安裝flash插件
set 手動 ams flash linu 4.3 trac 插件 啟動 /********************************************************************* * Author : Samson *
python(46):對字典進行排序
nav last itblog dac 註意 file trace erro [1] 原文地址: http://www.cnblogs.com/kaituorensheng/archive/2012/08/07/2627386.html 字典,形如 dic = {‘a‘