Android N(牛轧糖,7.0)中的定期作业

时间:2018-09-21 10:36:26

标签: android android-studio-3.0 android-7.0-nougat

好的,所以我找不到任何有关此文档或有用的网页。帮我StackOverflow,您是我唯一的希望。

好的,原来我的JobScheduler看起来像这样:

JobScheduler scheduler = (JobScheduler) getSystemService(JOB_SCHEDULER_SERVICE);
if(scheduler.getPendingJob(JOB_NUMBER) == null) {
    ComponentName componentName = new ComponentName(this, MyJobService.class);
    JobInfo info = new JobInfo.Builder(JOB_NUMBER, componentName)
            .setRequiresCharging(false)
            .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
            .setPersisted(true)
            .setPeriodic(60 * 60 * 1000L, 5 * 60 *1000)
            .build();
    int resultCode = scheduler.schedule(info);
    if (resultCode == JobScheduler.RESULT_SUCCESS) {
        Log.d(TAG, "Service is not running, Job " + String.valueOf(JOB_NUMBER) + " Scheduled.");
    } else {
        Log.d(TAG, "Service is not running, However job scheduling failed.");
    }
} else{
    Log.d(TAG, "Service is already scheduled.");
}

...在Oreo(v8.0)中完美运行。但是在Nougat v7.0中,该作业已“计划”但从未运行。在另一个stackoverflow问题中,我问到我可以通过将setPeriodic()替换为以下内容来使其运行:

.setMinimumLatency(1 * 1000)
.setOverrideDeadline(3 * 1000)

然后,该服务运行。但是,这不是定期的,只会运行一次。我找不到允许我在Android Nougat中执行定期工作的文档/教程/示例。有人可以帮我吗?

关于这个完全相同的主题还有其他stackoverflow问题:

Job Scheduler not running on Android N

Job Scheduler Not recurring in periodic in Android 7.0 (Nougat)

但是,他们两个都没有明确的答案。

最后一分钟注释:好吧,将FlexMillis传递到setPeriodic()似乎是可行的。我将做更多的测试。我不确定在触发logcat时我正在运行什么代码,但是我想通过以下方式进行

.setPeriodic(15 * 60 * 1000, 5 * 60 *1000)

作业排定10分钟后,它进入setPeriodic。但是,与Oreo不同,该作业在首次计划时不会运行。一旦建立工作,在奥利奥(Oreo)中,该工作就会运行。同样,我在文档的任何地方都找不到提到的内容。

1 个答案:

答案 0 :(得分:1)

您应该使用https://developer.android.com/topic/libraries/architecture/workmanager/。这是新的Android工具,它根据情况使用JobScheduler / AlarmManager等。