1. 程式人生 > >使用JobSchedule對任務進行合理排期

使用JobSchedule對任務進行合理排期

JobSchedule 是 Android 5.0之後新增進去的, 之前的版本沒有.

JobSchedule 原理是一種將任務安排在恰當的實際進行操作一種方案機制. 具體提供了那些可選的時機, 如下:

  1. 在可用網路下執行. 在7.0 之前, 應用可以通過監聽網路變化來執行任務, 當然了前提是應用必須存活. 7.0之後這類API已經失效, 而JobSchedule機制提供了網路變化的監聽. 進一步可以在網路變化的情況下執行某些操作. 例如在wifi環境下執行下載任務等.
  2. 裝置在充電或者空閒時執行一些任務.
  3. 設定執行的時間, 這個和上述兩條條件一起使用.
具體的實現如下:

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。

安卓端通過httpMysql進行增刪改查

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‘