【问题标题】:Android start running JobScheduler at specific timeAndroid 在特定时间开始运行 JobScheduler
【发布时间】:2016-07-11 07:27:47
【问题描述】:

我想在每天的特定时间启动 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 之外,将不胜感激。

【问题讨论】:

    标签: android android-alarms android-jobscheduler


    【解决方案1】:

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

    这里有一个可能有用的 sn-p:

    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。

    【讨论】:

    • 我不想每天安排它,我想安排一个特定日期的工作(让我们说星期天,星期三,星期六),是否可以使用 JobSchedular @prerak
    • 不确定,我能想到的唯一方法是您终止现有工作并重新安排具有偏移量的未来工作。需要在其中涉及一些数学:D
    • 您如何定期安排这项工作?就像 Op 想要每 20 分钟一次?根据文档“在定期作业上设置此属性没有意义,这样做会在调用 build() 时引发 IllegalArgumentException。”
    【解决方案2】:

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

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

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

    【讨论】:

    • 它仍然不允许您定期设置作业,原因与@kukroid 提到的相同
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多