【问题标题】:Android JobScheduler job not runningAndroid JobScheduler 作业未运行
【发布时间】:2018-02-21 10:05:57
【问题描述】:

我的混合 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(),我会按预期收到“已创建和计划的作业”通知。

从那时起,我预计每隔大约 30 秒就会收到来自上述Handler已处理!通知。在奇怪的情况下会出现通知,但从应用程序启动开始测量的时间完全是任意的,并且没有义务重复。显然,我在这里做错了什么。

【问题讨论】:

    标签: android-6.0-marshmallow job-scheduling


    【解决方案1】:

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

    15 分钟 !!!!

    我认为在 API 24 (Nogat) 之前可以使用更小的间隔,但不再使用。请注意您将在那里找到的各种 JobScheduler 教程。有很多已经过时了,Android Jobs 似乎是一个仍在不断发展的 API。

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

    请考虑以下策略

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-21
      • 1970-01-01
      • 2015-11-13
      • 2017-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-02
      相关资源
      最近更新 更多