11

我正在尝试使用新的 JobScheduler(由 tatarka 兼容)来实现后台刷新服务。这是我的服务

@Override
public boolean onStartJob(JobParameters params) {
    Timber.i("on start job: " + params.getJobId());
    return true;
}

@Override
public boolean onStopJob(JobParameters params) {
    Timber.i("on stop job: " + params.getJobId());
    return true;
}

这是我的工作信息

public void scheduleJob(View v) {
    JobInfo job = new JobInfo.Builder(kJobId++ /*jobid*/, new ComponentName(getActivity(), RefreshJobService.class))
            .setPeriodic(2000)
            .build();
    mTestService.scheduleJob(job);
}

在日志中我看到我的工作总是工作 1 分钟 12-31 12:38:03.884 10059-10059/@/RefreshJobService﹕ on stop job: 0 12-31 12:39:03.891 10059-10059/@/RefreshJobService﹕ on start job: 0 12-31 12:40:03.911 10059-10059/@/RefreshJobService﹕ on stop job: 0 12-31 12:42:08.841 10059-10059/@/RefreshJobService﹕ on start job: 0 12-31 12:43:08.858 10059-10059/@/RefreshJobService﹕ on stop job: 0

所以为什么?我将周期设置为 2000 毫秒,任何值都不会影响工作的 1 分钟间隔。为什么?

4

5 回答 5

8

在 Android 5.1.1 之前,单个作业的超时时间为 60 秒。从 Android 6 开始,超时时间现在为 10 分钟。

于 2016-03-15T07:29:51.120 回答
8

onStopJob当系统要取消您的工作时调用。它取消您的工作的原因是因为它认为它仍在运行。您需要jobFinished(params, bool)在工作中的某个时刻调用以告诉调度程序它已完成,否则它将超时并调用onStopJob以取消它。此外,返回 'true' 会onStartJob告诉系统您尚未完成处理。你应该返回'false',除非你还在做额外的工作,例如。将工作传递给单独的线程。

@Override
public boolean onStartJob(JobParameters params) {
    Timber.i("on start job: " + params.getJobId());
    jobFinished(params, false);
    return false;
}
于 2016-06-01T20:58:35.470 回答
6

从 API 26 (Oreo) 开始,为周期性作业设置小于 15 分钟的周期将至少在 15 分钟后执行。

于 2017-11-24T12:04:42.147 回答
3

听起来你在问为什么你在工作开始一分钟后就开始了 onStopJob。这 1 分钟的超时在此处的代码中定义

于 2015-07-19T02:58:57.367 回答
0

43matthew 是正确的,但我想对此添加更多内容。您所说的 2000 ms 是作业再次开始的周期性间隔,即每 2000 ms 执行一次此作业,而不是作业将执行的间隔。

于 2016-02-02T07:24:56.357 回答