android - 作业计划程序未在 Android N 上运行

标签 android android-jobscheduler android-7.0-nougat

Job Scheduler 在 Android Marshmallow 和 Lollipop 设备上按预期运行,但未运行且 Nexus 5x(Android N 预览版)。

调度作业的代码

        ComponentName componentName = new ComponentName(MainActivity.this, TestJobService.class.getName());
        JobInfo.Builder builder;
        builder = new JobInfo.Builder(JOB_ID, componentName);
        builder.setPeriodic(5000);
        JobInfo jobInfo;
        jobScheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
        jobInfo = builder.build();
        int jobId = jobScheduler.schedule(jobInfo);

服务在 list 中定义为:

<service android:name=".TestJobService"
            android:permission="android.permission.BIND_JOB_SERVICE" />

有人在 Android N(预览版)上遇到这个问题吗?

最佳答案

在 Android Nougat 中, setPeriodic(long intervalMillis) 方法调用使用 setPeriodic (long intervalMillis, long flexMillis) 安排定期作业。

根据文档:

JobInfo.Builder setPeriodic (long intervalMillis, long flexMillis)

Specify that this job should recur with the provided interval and flex. The job can execute at any time in a window of flex length at the end of the period.

intervalMillis long: Millisecond interval for which this job will repeat. A minimum value of getMinPeriodMillis() is enforced.

flexMillis long: Millisecond flex for this job. Flex is clamped to be at least getMinFlexMillis() or 5 percent of the period, whichever is higher.

计划为 5 秒的示例定期作业:

private static final int JOB_ID = 1001;
private static final long REFRESH_INTERVAL  = 5 * 1000; // 5 seconds

JobInfo jobInfo = new JobInfo.Builder(JOB_ID, serviceName)
        .setPeriodic(REFRESH_INTERVAL)
        .setExtras(bundle).build();

上述代码在 Lollipop & Marshmallow 中运行良好,但在 Nougat 中运行时,您会注意到以下日志:

W/JobInfo: Specified interval for 1001 is +5s0ms. Clamped to +15m0s0ms
W/JobInfo: Specified flex for 1001 is +5s0ms. Clamped to +5m0s0ms

由于我们将周期性刷新间隔设置为小于阈值的 5 秒getMinPeriodMillis()。 Android Nougat 强制执行 getMinPeriodMillis()

作为一种解决方法,如果作业间隔小于 15 分钟,我将使用以下代码定期安排作业。

JobInfo jobInfo;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
  jobInfo = new JobInfo.Builder(JOB_ID, serviceName)
      .setMinimumLatency(REFRESH_INTERVAL)
      .setExtras(bundle).build();
} else {
  jobInfo = new JobInfo.Builder(JOB_ID, serviceName)
      .setPeriodic(REFRESH_INTERVAL)
      .setExtras(bundle).build();
}

JobService 示例:

public class SampleService extends JobService {
    @Override public boolean onStartJob(JobParameters params) {
        doSampleJob(params); 
        return true;
    }

    @Override public boolean onStopJob(JobParameters params) {
        return false;
    }

    public void doSampleJob(JobParameters params) {
        // Do some heavy operation
        ...... 
        // At the end inform job manager the status of the job.
        jobFinished(params, false);
    }
}

关于android - 作业计划程序未在 Android N 上运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38344220/

相关文章:

android - 如何在android中的单例类中制作进度条

android - setRequiredNetworkType 不适用于定期任务?

android - Android Gradle构建工具DOC

android - 自定义 ImageView 中的 InflateException

android - FusedLocationProviderClient 始终为 null,locationAvailability 通常为 false

java - Android JobScheduler 执行多次

android.os.FileUriExposeException : file:///storage/emulated/0/test. txt 通过 Intent.getData() 暴露在应用程序之外

android - 使用 Android Nougat 在图库中打开图像

android - java.lang.SecurityException : MODE_WORLD_READABLE no longer supported

android - 如何在 NavigationDrawer 的底部设置一个 ListView?