使用JobScheduler
,我建立一個簡單的JobService
如下:週期的jobscheduler不尊重約束
@TargetApi(21)
public class SimpleJobService extends JobService {
private static final String TAG = "SimpleJobService";
@Override
public boolean onStartJob(JobParameters jobParameters) {
if (jobParameters.isOverrideDeadlineExpired()) {
Log.d(TAG, "This shouldn't happen");
Toast.makeText(this, "This shouldn't happen", Toast.LENGTH_LONG).show();
}
jobFinished(jobParameters, false);
return true;
}
@Override
public boolean onStopJob(JobParameters jobParameters) {
return true;
}
}
我然後設置所述JobService
爲週期性的(每分鐘)和未計量的需要網絡和計費:
ComponentName jobServiceComponent = new ComponentName(this, SimpleJobService.class);
JobInfo.Builder builder = new JobInfo.Builder(2, jobServiceComponent);
builder.setPersisted(true);
builder.setPeriodic(60000);
builder.setRequiresCharging(true);
builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED);
JobScheduler jobScheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
jobScheduler.schedule(builder.build());
的我SimpleJobService
的onStartJob
正在無論我的設備是否正在充電稱爲或者如果它是一個計量的網絡上。
爲setPeriodic(long)
的文件說,它不能配合使用setOverrideDeadline(long)
(我不這樣),但我很驚訝,jobParameters.isOverrideDeadlineExpired()
在onStartJob
是有史以來true
與此設置。
我在這裏錯過了什麼嗎?
這看起來像一個Android的bug,但我很驚訝,我找不到其他人報告這個問題。
,此行爲已觀察到在Android 6.0.1
不錯的地方。如果這是有意的行爲,我當然認爲它可以在API文檔中保留一個評論,比如'setOverrideDeadline()'上的評論,因爲不小心很容易被它絆住 - 例如,在計量網絡上傳輸大量數據。 – HexAndBugs
雖然這個描述似乎是一個完全合理的方式來實現JobScheduler,我認爲這裏肯定有bug。進一步的測試表明,如果我從'onStartJob'調用'jobFinished(jobParameters,true)',那麼這個工作就不會被重新安排,直到工作的其他標準爲真,而如果它故意使用這個時間段作爲某種截止期限,然後期望它應用退休標準,按照我的要求重新安排工作,繼續忽略其他標準。這種行爲似乎與我不一致! – HexAndBugs
是的,退職的職位沒有與他們相關的覆蓋期限,這包括由定期工作設置的隱式覆蓋期限。 – ianhanniballake