3

使用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的。SimpleJobService

的文档setPeriodic(long)说它不能与它一起使用setOverrideDeadline(long)(而且我也不是),但我很惊讶jobParameters.isOverrideDeadlineExpired()在这个设置中onStartJob一直存在。true

我在这里错过了什么吗?

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

在 Android 6.0.1 上观察到此行为

4

1 回答 1

3

如源代码中所见,定期作业具有周期结束的隐式截止日期。

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

于 2017-04-04T23:01:49.367 回答