Android JobScheduler 作业不是 运行

Android JobScheduler job not running

我的混合 Cordova Android 应用程序使用一个自定义插件,我每隔大约 30 分钟就在其中执行大量后台工作。到目前为止,我一直在使用 AlarmMangersetInexact 警报来执行这项工作。我对该路线唯一真正的问题是警报无法在重新启动后继续存在。鉴于我现在只支持 Android 6 (API 23)+ 台设备,我现在正在尝试用 JobScheduler 替换 AlarmManager。我到目前为止的努力如下所示

public class UnyService extends JobService 
{

 @Override
 public boolean onStartJob(JobParameters params) 
 {
  UnyHandler.sendMessage(Message.obtain(UnyHandler,1,params));
  return true;
 }

 @Override
 public boolean onStopJob(JobParameters params)
 {
  UnyHandler.removeMessages(1);
  return false;
 }

我正在使用 Handler 来执行实际工作。 Handler的代码如下所示

 private Handler UnyHandler = new Handler(new Handler.Callback()
 {
  @Override
  public boolean handleMessage(Message msg)
  {
   Feedback.postBackInfo("Handled it!");
   jobFinished((JobParameters)msg.obj,false);
   return true;
  }

  });

然后我使用下面的代码来完成工作,运行

private void launchTimerJob()
{
 timerJob = 
 (JobScheduler)context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
 JobInfo.Builder builder = new JobInfo.Builder(1,new 
 ComponentName(Utils.packName,UnyService.class.getName()));

 builder.setPeriodic(30000);
 builder.setPersisted(true);
 builder.setBackoffCriteria(30000,JobInfo.BACKOFF_POLICY_LINEAR);
 if (0 >= timerJob.schedule(builder.build())) 
 Feedback.postBackInfo("Job Build Error");
 else Feedback.postBackInfo("Job Created and Scheduled");
}

其中 FeedbackUtils 是我应用程序中提供支持服务的其他 类。为了便于测试,我使用了一个相对较小的 30 秒周期。

当我安装并启动应用程序时,插件初始化代码调用 launchTimerJob(),我按预期收到了 "Job Created and Scheduled" 通知。

从那时起,我预计会收到 Handled It! 上面 Handler 的通知,间隔大约为 30 秒。偶尔会出现一条通知,但是从应用程序启动开始计算的时间完全是任意的,并且没有义务重复。显然,我在这里做错了什么。

Android 文档可以更好地提到 最小间隔 允许 周期性作业是 900,000 毫秒 ,即

15 minutes !!!!

我了解到,在 API 24 (Nogat) 之前,可以使用更小的间隔,但现在不行了。小心你会在那里找到的各种 JobScheduler 教程。有很多已经过时了,Android 乔布斯似乎仍在发展 API。

我自己最初使用 AlarmManager 的原因是为了在应用程序处于后台运行时启用后台任务。然而,随着打瞌睡模式的到来,这个策略失败了,因为当设备打瞌睡时,应用程序根本不会收到广播消息。

改为考虑以下策略

  • 当应用程序处于前台时,您可以非常简单地使用 Handler 来管理周期性任务 - 即使是那些以几秒为间隔发生的任务。
  • 当 phone 正在打瞌睡时,任何普通应用程序都不应该以该频率(每隔几秒)执行后台任务 - 当需要时,有一条通过应用程序特定请求的路线免于电池优化。在这种情况下,一个周期为 15 分钟的周期性 JobScheduler 是您能做的最好的。