【问题标题】:How should i migrate my app to use JobScheduler?我应该如何迁移我的应用程序以使用 JobScheduler?
【发布时间】:2017-09-19 13:03:12
【问题描述】:

我的应用使用这种经典模式来安排周期性任务:

  1. 通过AlarmManager 设置准确的闹钟(通过setExactAndAllowWhileIdle(),因为即使在打瞌睡时它也必须响起)
  2. onReceive() 通过WakefulBroadcastReceiver.startWakefulService() 开始一个IntentService
  3. onHandleIntent() 中完成工作,完成后致电WakefulBroadcastReceiver.completeWakefulIntent()

今天我将 targetSdkVersion 更新为 26,并面临一个可怕的事实,即 WakefulBroadcastReceiver 已被弃用

我立即去阅读 API 文档,发现如下:

从 Android O 开始,背景检查限制使此类没有 更长的时间一般有用。 (启动服务一般是不安全的 从收到广播开始,因为你没有任何保证 您的应用程序此时处于前台,因此允许 这样做。)相反,开发人员应该使用android.app.job.JobScheduler 安排工作,这不需要应用程序保持唤醒 这样做时锁定(系统将负责保持唤醒锁定 工作)。

这让我有点困惑,我真的不明白AlarmManager.setExactAndAllowWhileIdle() 的目的是什么,而无法再让设备保持唤醒状态。

正如我所见,我无法使用JobScheduler 设置运行作业的确切时间,只能设置条件(例如网络类型或充电状态),所以我不知道在这里做什么。

我也想过

  • 同时使用AlarmManagerJobScheduler

    设置警报(使用setExactAndAllowWhileIdle())并立即从onReceive() 开始工作(通过JobScheduler)。由于JobScheduler 提供了WakeLock,因此不需要WakefulBroadcastReceiver

    (这有意义吗?)

  • 尽管 WakefulBroadcastReceiver 已被弃用,但请继续使用。

我非常感谢您对此事的任何建议。

【问题讨论】:

  • 你找到否定答案了吗???
  • 现在最好直接使用 Jetpack 的 WorkManager 而不是 JobScheduler。 afaik,仍然没有方法可以设置调度工作的确切时间,因此将AlarmMangerWorkManager.OneTimeWorkRequest 结合起来,正如您所暗示的那样,似乎仍然是在精确时间“可能”完成任务的方法video

标签: android android-jobscheduler


【解决方案1】:

在 android-o 及更高版本中,您可以像这样在没有警报管理器的情况下定义重复任务:

// schedule the start of the service "TestJobService" every 10 - 30 minutes
public static void scheduleJob(Context context) {
    ComponentName serviceComponent = new ComponentName(context, TestJobService.class);
    JobInfo.Builder builder = new JobInfo.Builder(0, serviceComponent);
    builder.setMinimumLatency(10 * 60 * 1000); // wait at least
    builder.setOverrideDeadline(30 * 60 * 1000); // maximum delay
    JobScheduler jobScheduler = context.getSystemService(JobScheduler.class);
    jobScheduler.schedule(builder.build());
}

【讨论】:

    【解决方案2】:

    您可以使用由警报触发的 BroadcastReciever,并在该接收器中调用 JobIntentService.enqueueWork 与您的服务,您需要将其转换为 JobIntentService 并实现 onHandleWork 方法。
    解决方案在这里描述:
    Issue Moving from IntentService to JobIntentService for Android O

    【讨论】:

      猜你喜欢
      • 2011-01-21
      • 1970-01-01
      • 1970-01-01
      • 2011-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多