天天看點

JobScheduler用法

JobScheduler是Android L(API21)5.0新增的特性,它可以将作業推遲(合并)到稍後或指定條件下(如裝置充電或連入 WLAN 時)執行來優化電池壽命

JobScheduler文檔

JobScheduler 例子

近幾個android版本中針對電量優化功能

JobScheduler用法:

  • 1.建立一個MyJobService繼承自JobService(具體業務邏輯實作)

實作以下兩個抽象方法:

onStartJob:
在任務開始執行時觸發.傳回false表示執行完畢,傳回true表示需要開發者自己調用jobFinished方法通知系統已執行完成
onStopJob:
在任務停止執行時觸發(jobFinished不會直接觸發onStopJob)
           
public class MyJobService extends JobService {
    
        @Override
        public boolean onStartJob(JobParameters params) {
            return false;
        }
    
        @Override
        public boolean onStopJob(JobParameters params) {
            return false;
        }
    }
           

AndroidManifest.xml聲明:

<service
            android:name=".service.SimpleJobService"
            android:permission="android.permission.BIND_JOB_SERVICE" />
           
  • 2.Activity中配置JobInfo,

    JobInfo指定了一個任務的概要資訊,比如何時啟動,啟動時需要滿足什麼條件等等

JobInfo.Builder builder = new JobInfo.Builder(jobId, mServiceComponent)
            .setMinimumLatency(2000) // 設定任務最少延遲多久後執行
            .setOverrideDeadline(50000) // 設定最多延遲多久後執行(若到期還沒有到達規定的條件也會執行)
            .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED) //設定網絡條件,非資料
            .setRequiresCharging(true) // 是否在充電時執行
            .setRequiresDeviceIdle(false); // 是否在空閑idle時執行(裝置有一段時間沒有使用時才會啟動該任務)

    // Schedule job
    JobScheduler tm = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
    tm.schedule(builder.build());
           
> setRequiredNetworkType:設定網絡條件:
    JobInfo.NETWORK_TYPE_NONE(無網絡時執行,預設)
    JobInfo.NETWORK_TYPE_ANY(有網絡時執行)
    JobInfo.NETWORK_TYPE_UNMETERED(網絡無需付費時執行,資料流量)
> setPersisted(boolean isPersisted):
    裝置重新開機之後你的任務是否還要繼續執行
> setPeriodic:
    設定時間間隔,機關毫秒(該方法不能和setMinimumLatency、setOverrideDeadline這兩個同時調用)
setRequiredNetworkType(int networkType):
這個方法讓你這個任務隻有在滿足指定的網絡條件時才會被執行。預設條件是JobInfo.NETWORK_TYPE_NONE,這意味着不管是否有網絡這個任務都會被執行。另外兩個可選類型,一種是JobInfo.NETWORK_TYPE_ANY,它表明需要任意一種網絡才使得任務可以執行。另一種是JobInfo.NETWORK_TYPE_UNMETERED,它表示裝置不是蜂窩網絡( 比如在WIFI連接配接時 )時任務才會被執行。
> setBackoffCriteria:
    退避政策,可以設定等待時間以及重連政策
           

需要注意的是setRequiredNetworkType, setRequiresCharging 和 setRequiresDeviceIdle這幾個方法可能會使得你的任務無法執行.非調用setOverrideDeadline(long time)設定了最大延遲時間,得你的任務在為滿足條件的情況下也會被執行.

  • 3.執行JobScheduler
// Schedule job
    JobScheduler js = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
    if(js.schedule(builder.build()) == JobScheduler.RESULT_FAILURE ) {
        // the result of the schedule request
    }
           
> schedule: 把指定的JobInfo對象放入排程隊列,滿足條件時觸發該對象中定義的JobService
> cancel: 取消指定編号的任務
> cancelAll: 取消所有任務
> getAllPendingJobs: 擷取所有挂起(未執行)的任務