为什么不遵守 setOverrideDeadline?

Why is setOverrideDeadline not respected?

我使用以下代码在网络可用时安排工作:

static JobScheduler jobScheduler(Context context) {
    return (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
}

static JobInfo jobInfo(Context context, Date nextTime) {
    return new JobInfo.Builder((int) R.string.action_send_mail, new ComponentName(context, MessageJobService.class))
                .setMinimumLatency(max(0, nextTime.getTime() - System.currentTimeMillis()))
                .setOverrideDeadline(15 * 1000)
                .setBackoffCriteria(5000, JobInfo.BACKOFF_POLICY_EXPONENTIAL)
                .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
                .build();
};

public static void scheduleNextJob(Context context) {
    MailMessage mailMessage = DbHelper.inContext(context).loadNextMessage();

    if(mailMessage != null) {
        jobScheduler(context).schedule(jobInfo(context, mailMessage.getNextAttempt()));
    }
}

我对 setOverrideDeadline 的理解是,当网络可用时,我的作业将在 5 秒后触发,或不迟于 15 秒。实际上,如果我启用航空公司模式,并且 运行 scheduleNextJob 在我禁用航空公司模式之前,作业永远不会触发。

那时,在我的工作中,isOverrideDeadlineExpired 是正确的,所以我很确定截止日期已经确定,只是似乎没有得到遵守。

为什么没有遵守覆盖截止日期?

显然 setMinimumLatency(0)setOverrideDeadline 的组合没有按预期工作。将最小延迟更改为至少 1 似乎可以解决问题:

static JobInfo jobInfo(Context context, Date nextTime) {
    return new JobInfo.Builder((int) R.string.action_send_mail, new ComponentName(context, MessageJobService.class))
                .setMinimumLatency(max(1, nextTime.getTime() - System.currentTimeMillis()))
                .setOverrideDeadline(15 * 1000)
                .setBackoffCriteria(5000, JobInfo.BACKOFF_POLICY_EXPONENTIAL)
                .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
                .build();
};