Android如何使用JobDispatcher api计划每晚的任务?

时间:2017-08-23 10:10:04

标签: android alarmmanager android-jobscheduler firebase-job-dispatcher

我必须每天晚上从网络服务器下载json响应,之前我已经使用AlarmManager来安排任务,但我认为对于这种情况JobDispatcher很好,因为它自动执行任务,如果网络可用,所以我没有必要管理这种stuf.But我已经找到了许多JobDispatcherJobScheduler的例子,所有这些例子都是一个简单的工作被安排或安排一段时间延迟但是有与我的要求无关, 如果有人有这个想法,请帮助或提供与此相关的任何链接,这将是非常有帮助的。

更新

1。 如何让它每晚都能正常工作,因为目前它只设置闹钟到午夜一次,如何让它在每个晚上同时重复?

2 个答案:

答案 0 :(得分:4)

这是您需要安排基于时间的工作的方式

FirebaseJobDispatcher jobDispatcher = new FirebaseJobDispatcher(
                new GooglePlayDriver(this));

Calendar now = Calendar.getInstance();
Calendar midNight = Calendar.getInstance();
midNight.set(Calendar.HOUR, 12);
midNight.set(Calendar.MINUTE, 0);
midNight.set(Calendar.SECOND, 0);
midNight.set(Calendar.MILLISECOND, 0);
midNight.set(Calendar.AM_PM, Calendar.AM);

long diff = now.getTimeInMillis() - midNight.getTimeInMillis();

if (diff < 0) {
    midNight.add(Calendar.DAY_OF_MONTH, 1);
    diff = midNight.getTimeInMillis() - now.getTimeInMillis();
}

int startSeconds = (int) (diff / 1000); // tell the start seconds
int endSencods = startSeconds + 300; // within Five minutes 

Job networkJob = jobDispatcher.newJobBuilder()
        .setService(NetworkJob.class)
        .setTag(NetworkJob.ID_TAG)
        .setRecurring(true)
        .setTrigger(Trigger.executionWindow(startSeconds, endSencods))
        .setLifetime(Lifetime.FOREVER)
        .setReplaceCurrent(true)
        .setConstraints(Constraint.ON_ANY_NETWORK)
        .build();

jobDispatcher.schedule(networkJob);

答案 1 :(得分:1)

我建议您将JobDispatcher设置为在下一个午夜开始,即将开始时间设置为现在与下一个午夜之间的差值。启动后,您可以让它启动一个在24小时内启动的新作业,即该服务将启动一个新的Job,并将其开始时间设置为24小时,并使该作业重复执行。