定期JobScheduler不遵守约束

时间:2017-04-04 22:01:06

标签: android android-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());

无论我的设备是在充电还是在未计量的网络上,我onStartJob的{​​{1}}都会被调用。

setPeriodic(long)的文档说它不能与setOverrideDeadline(long)一起使用(我也不是),但我对{{1} SimpleJobService感到惊讶这个设置永远是jobParameters.isOverrideDeadlineExpired()

我在这里错过了什么吗?

对我来说,这看起来像是一个Android错误,但我很惊讶我找不到报告此问题的其他人。

在Android 6.0.1上观察到此行为

1 个答案:

答案 0 :(得分:2)

定期工作的隐含截止日期为the source code中所见的期末。

就像明确设定截止日期一样,这使您有机会决定如何最好地处理延长的时间段(您注意到最小间隔,可在具有{{3}的Android 7.0+设备上查询})当你的条件不满足时。例如,如果您的约束条件是硬性要求,则可以调用jobFinished(jobParameters, false)等待下一个周期性终点或条件为真。