Android在特定时间开始运行JobScheduler

时间:2016-07-11 07:27:47

标签: android android-alarms android-jobscheduler

我想在每天的特定时间开始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旁边将非常感激。

2 个答案:

答案 0 :(得分:6)

我通过以下方式实现了它(没有AlarmManager),创建了一个新的Job(显然有一个唯一的JOB_ID),并告诉JobScheduler在某个时间安排它未来使用setOverrideDeadline()

这是一个可能有帮助的片段:

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中删除任何现有的职位ID。

答案 1 :(得分:1)

在jobInfo上添加setMinimumLatency并考虑当前时间和目标时间,即可解决此问题。

tf.mul

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