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: 擷取所有挂起(未執行)的任務