JobScheduler android任務調度處理組件(類似QuartZ)


JobScheduler是Android L(API21)新增的特性,用於定義滿足某些條件下(電量,網絡,時間,屏幕熄/亮 ,設備是否空閑 等)執行的任務。它的宗旨是把一些不是特別緊急的任務放到更合適的時機批量處理,這樣可以有效的節省電量。

自 Android 5.0 發布以來,JobScheduler 已成為執行后台工作的首選方式,其工作方式有利於用戶。應用可以在安排作業的同時允許系統基於內存、電源和連接情況進行優化。JobScheduler 可實現控制和簡潔性。

 

schedule用法過程說明:

一   創建繼承於JobService的對象(該service運行在主線程

     public class MyJobService extends JobService {
     @Override
     public boolean onStartJob(JobParameters params)
     { return false; }
 
    @Override
    public boolean onStopJob(JobParameters params)
    { return false; }
    }

     1  在onStartJob中完成具體的業務邏輯

     當任務開始時會執行 onStartJob方法,因為這是系統用來觸發已經被執行的任務。這個方法返回一個boolean值。如果返回值是false,系統假設這個方法返回時任務已經執行完畢。如果返回值是true,那么系統假定這個任務正要被執行。當任務執行完畢時你需要調用 jobFinished來通知系統。


     2   當系統接收到一個取消請求時,系統會調用onStopJob方法取消正在等待執行的任務
其實onStopJobjobFinished正常調用結束一個job時,也是不會調用的,只有在該job沒有被執行完,就被cancel掉的時候回調到,比如某個job還沒有執行就被JobSchedulerCancel掉時,或者在某個運行條件不滿足時,比如原來在Wifi環境允許的某個任務,執行過程中切換到了非Wifi場景,那也會調用該方法。改方法也返回一個boolean值,返回true表示會重新放到JobSchedulerreScheduler,false表示直接忽略。

 

 

二  創建JobInfo對象(采用builder模式),設置監聽任務執行的條件(監聽電量,網絡,時間,屏幕亮/熄,設備是否空閑 等)

     創建定時任務時,你可以使用JobInfo.Builder來構建一個JobInfo對象,然后傳遞給Scheduler底層的jobSchedulerService。

     JobInfo.Builder接收兩個參數,第一個參數是你要運行的任務的標識符ID,第二個是這個JobService組件的類名

     1  ComponentName jobService = new ComponentName(this, MyJobService.class); //JobService組件的名包裹

     2  JobInfo jobInfo = new JobInfo.Builder(123, jobService) //任務Id等於123

                .setMinimumLatency(5000)// 任務最少延遲時間 

                .setOverrideDeadline(60000)// 任務deadline,當到期沒達到指定條件也會開始執行 

                .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)// 網絡條件,默認值NETWORK_TYPE_NONE

                .setRequiresCharging(true)// 是否充電 

                .setRequiresDeviceIdle(false)// 設備是否空閑

                .setPersisted(true) //設備重啟后是否繼續執行

                .setBackoffCriteria(3000,JobInfo.BACKOFF_POLICY_LINEAR) //設置退避/重試策略

                .build();

 

 


三  先獲取JobScheduler調度器的代理對象(要理解這個過程,那么就需要先看看JobSchedulerService的啟動過程)

         JobScheduler scheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);

         1 對象里面主要有schedule(jobinfo對象執行條件) 啟動:

         scheduler.schedule(jobInfo);

         2 有cancel(job任務id) 取消:

         scheduler.cancel(123); //取消jobId=123的任務

         scheduler.cancelAll(); //取消當前uid下的所有任務

 

JobScheduler是個系統Service,我們的將自己的JobInfo傳給它,由系統負責調用,其中這個schedule方法會返回一個整型。如果schedule方法失敗了,它會返回一個小於0的錯誤碼。否則它會我們在JobInfo.Builder中定義的標識id。

如果你的應用想停止某個任務,你可以調用JobScheduler對象的cancel(int jobId)來實現;如果你想取消所有的任務,你可以調用JobScheduler對象的cancelAll()來實現。



 

JobScheduler調度器過程(JobSchedulerService的啟動過程)

https://www.cnblogs.com/softwarelanguagebs/p/9531562.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM