在Android中使用JobScheduler安排作业

luc*_*ino 8 jobs android scheduling task android-jobscheduler

我在新的Android API 21中使用JobScheduler的作业计划有问题.这是我用60秒间隔调度作业的代码,如下所示:

ComponentName serviceName = new ComponentName(this, MyJobService.class);
JobInfo jobInfo = new JobInfo.Builder(0, serviceName)
        .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
        .setPeriodic(60000)
        .build();
Run Code Online (Sandbox Code Playgroud)

我的JobService只在Logcat中打印运行时,但是日志显示服务在这个时刻运行:

03-18 08:37:26.334: I/JOB(32662): Wed Mar 18 08:37:26 BRT 2015
03-18 08:37:56.364: I/JOB(32662): Wed Mar 18 08:37:56 BRT 2015
03-18 08:39:21.418: I/JOB(32662): Wed Mar 18 08:39:21 BRT 2015
03-18 08:41:51.670: I/JOB(32662): Wed Mar 18 08:41:51 BRT 2015
03-18 08:45:52.192: I/JOB(32662): Wed Mar 18 08:45:52 BRT 2015
03-18 08:54:20.678: I/JOB(32662): Wed Mar 18 08:54:20 BRT 2015
Run Code Online (Sandbox Code Playgroud)

这很奇怪,因为我用setPeriodic(60000)方法设置它应该在1分钟内执行至少1次.同样好奇的是如何在运行之间增加间隔.此时的时间是2015年3月18日星期三09:09:00 BRT 2015并且工作不会被执行更多.

这是JobScheduler API的问题吗?(我在Android 5.0.1的Nexus 5中运行)

Min*_*Man 9

时间的变化与重试工作的退避标准有关.默认情况下,它设置为指数.我猜你通过打电话来完成你的工作也没有正确完成你的工作jobFinished(JobParameters params, boolean needsReschedule).

我写了一篇博文,重点关注JobScheduler的所有小事.我强烈建议阅读它.


Mat*_*zyk 5

我有同样的问题,我认为它可能与JobInfo类的内部要求有关:

JobInfo的源代码

    /* Minimum interval for a periodic job, in milliseconds. */
private static final long MIN_PERIOD_MILLIS = 15 * 60 * 1000L;   // 15 minutes
Run Code Online (Sandbox Code Playgroud)

看起来JobInfo似乎不允许您将间隔设置得小于此值.