定期的JobScheduler不遵守约束
作者:互联网
使用JobScheduler
,我设置了一个简单的JobService
,如下所示:
@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)
一起使用(无论如何我也不能),但是我很惊讶onStartJob中的jobParameters.isOverrideDeadlineExpired()对于这种设置曾经是真的.
我在这里想念什么吗?
在我看来,这似乎是一个Android错误,但令我惊讶的是我找不到其他人报告此问题.
在Android 6.0.1上观察到此行为
解决方法:
定期工作有一个隐含的期限期末,如the source code所示.
就像明确设置截止日期一样,这可以让您有机会在不满足条件的情况下,决定如何最好地处理延长的时间(您会注意到有一个最小间隔,可在Android 7.0设备上查询到getMinPeriodMillis()).例如,如果约束是硬性要求,则可以调用jobFinished(jobParameters,false)等待下一个周期性终点或条件为真.
标签:android,android-jobscheduler 来源: https://codeday.me/bug/20191011/1890144.html