【问题标题】:Periodic JobScheduler doesn't respect constraints定期 JobScheduler 不尊重约束
【发布时间】:2017-04-04 22:01:06
【问题描述】:

使用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());

无论我的设备是在充电还是在未计量的网络上,都会调用我的SimpleJobServiceonStartJob

setPeriodic(long) 的文档说它不能与 setOverrideDeadline(long) 一起使用(我反正不是),但我很惊讶 onStartJob 中的 jobParameters.isOverrideDeadlineExpired() 永远是 true这个设置。

我错过了什么吗?

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

在 Android 6.0.1 上观察到此行为

【问题讨论】:

    标签: android android-jobscheduler


    【解决方案1】:

    the source code 所示,定期作业有一个隐含的周期结束期限。

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

    【讨论】:

    • 好地方。如果这是预期的行为,我当然认为它需要在 API 文档中发表评论,例如 setOverrideDeadline() 上的评论,因为粗心的人很容易被它绊倒——例如在计量网络上传输大量数据。
    • 虽然这个描述似乎是实现 JobScheduler 的完全合理的方式,但我认为这里一定有一个错误。进一步的测试表明,如果我从onStartJob 调用jobFinished(jobParameters, true),那么在该工作的其他标准为真之前,该工作永远不会重新安排,而如果它故意使用该时间段作为某种截止日期,我希望它会那样应用退避标准并按照我的要求重新安排工作,继续忽略其他标准。这种行为对我来说似乎不一致!
    • 是的,回退的作业没有与之关联的覆盖期限,这包括定期作业设置的隐式覆盖期限。
    猜你喜欢
    • 2021-10-26
    • 1970-01-01
    • 2019-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多