Android在特定时间开始运行JobScheduler

Android在特定时间开始运行JobScheduler,android,android-alarms,android-jobscheduler,Android,Android Alarms,Android Jobscheduler,我想每天在特定时间启动作业计划程序,并在3小时后完成 我每20分钟触发一次作业,持续3小时,但在JobInfo.Builder类中,没有选择在准确的时间启动作业 回顾一下类概述,这里没有设置启动JobScheduler的时间 显然,我不想运行一整天,并检查时间匹配,这将消耗比需要更多的电池,是糟糕的编程 我想在指定的时间发出警报,并触发此作业,但这似乎有点过火。 JobInfo.Builder builder = new JobInfo.Builder(NIGHT_SYNC_JOB_ID,

我想每天在特定时间启动作业计划程序,并在3小时后完成

我每20分钟触发一次作业,持续3小时,但在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之外,将不胜感激

我通过以下方式实现了它(没有
AlarmManager
),创建了一个新作业(显然有一个唯一的
Job\u 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();
    }

确保计算出要调度任务的正确时间偏移量,并从
作业调度器中删除任何现有作业ID

在jobInfo上添加setMinimumLatency(与当前时间和目标时间的差异)可解决此问题

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

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

我不想每天调度它,而是想在特定的日期(比如星期天、星期三、星期六)调度作业,是否可以使用JobSchedular@prerak?我不确定,我唯一能想到的方法是取消现有作业,然后用偏移量重新调度未来的作业。需要涉及一些数学知识:你如何定期安排这项工作?像是每20分钟一次的行动?根据文档“在定期作业上设置此属性没有意义,这样做将在调用build()时引发IllegalArgumentException。”