使用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