我应该如何迁移我的应用程序以使用JobScheduler?

jus*_*oob 13 android android-jobscheduler

我的应用程序使用此经典模式来安排定期任务:

  1. 通过AlarmManager(通过setExactAndAllowWhileIdle(),因为即使在Doze中也必须关闭)设置确切的警报
  2. 一开始IntentServiceonReceive()通过WakefulBroadcastReceiver.startWakefulService()
  3. 完成工作onHandleIntent()WakefulBroadcastReceiver.completeWakefulIntent()在完成后打电话.

今天我将targetSdkVersion更新为26,并面临着WakefulBroadcastReceiver被弃用的可怕事实.

我立即去阅读API文档,发现以下内容:

从Android O开始,后台检查限制使这个类不再普遍有用.(从接收广播开始提供服务通常是不安全的,因为您无法保证您的应用程序此时处于前台,因此可以这样做.)相反,开发人员应该使用android.app.job.JobScheduler安排一项工作,这并不要求应用程序在执行此操作时保持唤醒锁定(系统将负责为该作业保持唤醒锁定).

这对我来说有点令人困惑,我真的不明白为什么AlarmManager.setExactAndAllowWhileIdle()不能让设备保持清醒状态的目的是什么.

因为我看到我无法设置运行作业的确切时间JobScheduler,只有条件(例如网络类型或充电状态)所以我不知道该怎么做.

我想到了

  • 使用AlarmManagerJobScheduler在一起

    设置闹钟(带setExactAndAllowWhileIdle())并JobScheduler立即开始作业(通过)onReceive().既然JobScheduler提供了WakeLock,WakefulBroadcastReceiver就不需要了.

    (这有意义吗?)

要么

  • 继续使用WakefulBroadcastReceiver,尽管被弃用.

我非常感谢你对此事的任何建议.

k3b*_*k3b -1

在 android-o 及更高版本中,您可以定义一个没有 Alarmmanager 的重复任务,如下所示:

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