Android JobScheduler作业未运行

Dro*_*dOS 0 job-scheduling android-6.0-marshmallow

我的混合式Cordova Android应用程序使用一个自定义插件,在该插件中,我大约每30分钟执行一次后台工作。到现在为止,我已经使用AlarmMangersetInexact报警执行工作。我对该路由唯一真正的问题是,警报无法在重新启动后幸免。鉴于我现在只支持Android的6(API 23)+设备现在我与更换试验AlarmManagerJobScheduler。到目前为止,我的努力如下所示

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;
 }
Run Code Online (Sandbox Code Playgroud)

我正在使用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;
  }

  });
Run Code Online (Sandbox Code Playgroud)

然后,我使用以下代码启动并运行该作业

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");
}
Run Code Online (Sandbox Code Playgroud)

我的应用中的哪里Feedback以及Utils提供支持服务的其他类。为了方便测试,我使用了30秒的较短时间。

当我安装并启动该应用程序时,插件初始化代码会调用,launchTimerJob()并且按预期返回“创建和计划作业”通知。

从那时起,我期望得到处理!Handler上方以大约30秒的间隔发送通知。通知是在奇怪的情况下出现的,但是从应用程序启动起算是完全任意的时间,并且不必重复。显然,我在这里做错了。非常感谢您对确定问题的任何帮助。

Dro*_*dOS 9

Android的文档可以做提一个更好的工作的最小间隔时间允许的定期工作90万毫秒,即

15分钟 !!!!

我收集到在API 24(Nogat)之前可以使用较小的时间间隔,但不再使用。警惕那里提供的各种JobScheduler教程。有很多已经过时,Android Jobs似乎仍在不断发展。

我自己最初使用的原因AlarmManager是使后台程序能够在应用程序后台运行时执行。但是,随着打ze模式的到来,该策略失败了,因为当设备打zing睡时,该应用将根本不会收到广播消息。

请考虑以下策略

  • 当应用程序出现在前台时,您可以非常简单地使用处理程序来管理定期任务-即使是间隔几秒钟的任务。
  • 在手机打zing睡时,任何普通的应用程序都不必以该频率(每隔几秒钟)执行后台任务-并且在需要时,通过特定的请求会有一条路线可以使该应用程序免于电池优化。在这种情况下,您最好执行15分钟的定期JobScheduler。