17

我想每天在特定时间启动 JobScheduler 并在 3 小时后完成。

我有每 20 分钟和 3 小时触发一次作业的部分,但是在 JobInfo.Builder 类中没有在确切时间开始作业的选项。

查看 JobInfo.Builder类概述,那里没有设置启动 JobScheduler 的时间。

显然,我不想整天运行它,并检查时间是否匹配,这将消耗比需要更多的电池,并且是糟糕的编程。

我正在考虑在我指定的时间发出警报并触发这项工作,但这似乎有点矫枉过正。

 JobInfo.Builder builder = new JobInfo.Builder(NIGHT_SYNC_JOB_ID, 
 new ComponentName(context, NightSyncDataJobService.class));

 //Job starts at 11pm, and ends at 2am. Running every 20 minutes.
 builder.setPersisted(true); //Job scheduled to work after reboot
 builder.setPeriodic(Consts.ONE_MINUTE * 20);

 JobScheduler jobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
 jobScheduler.schedule(builder.build());

如果您对该问题有任何其他解决方案,除了触发此 JobScheduler 的 AlarmManger 之外,将不胜感激。

4

2 回答 2

8

我通过以下方式实现它(没有),创建了一个新作业(显然AlarmManager具有独特性),并告诉它在将来的某个时间使用.JOB_IDJobSchedulersetOverrideDeadline()

这是一个可能有用的片段:

private JobInfo getJobInfoForFutureTask(Context context,
                                        long timeTillFutureJob) {
        ComponentName serviceComponent = new ComponentName(context, SchedulerService.class);

        return new JobInfo.Builder(FUTURE_JOB_ID, serviceComponent)
                .setRequiredNetworkType(JobInfo.NETWORK_TYPE_NONE)
                .setOverrideDeadline(timeTillFutureJob)
                .setRequiresDeviceIdle(false)
                .setRequiresCharging(false)
                .setPersisted(true)
                .build();
    }

确保计算出您想要安排任务的正确时间偏移量,并从JobScheduler.

于 2017-04-05T21:57:12.293 回答
1

在 jobInfo 上添加 setMinimumLatency 并遵循当前时间和目标时间解决了这个问题。

JobInfo jobInfo = new JobInfo.Builder(1, componentName)
                .setPersisted(true)
                .setBackoffCriteria(6000, JobInfo.BACKOFF_POLICY_LINEAR)
                .setMinimumLatency(1000 * 60)
                .build();

对于上面的示例,调度程序将在 60 秒后工作。

于 2018-07-31T20:20:59.820 回答