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

时间:2017-09-19 13:03:13

标签: android android-jobscheduler

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

  1. 通过AlarmManager(通过setExactAndAllowWhileIdle()设置确切的闹钟,因为即使在Doze中也必须关闭)
  2. IntentService通过onReceive()
  3. 开始WakefulBroadcastReceiver.startWakefulService()
  4. 完成onHandleIntent()中的工作并在完成后致电WakefulBroadcastReceiver.completeWakefulIntent()
  5. 今天我将targetSdkVersion更新为26并面临 WakefulBroadcastReceiver已被弃用的可怕事实。

    我立即阅读了API文档并找到了以下内容:

      

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

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

    正如我所知,我无法确定使用JobScheduler运行作业的确切时间,只有条件(例如网络类型或充电状态),所以我不知道该怎么做。

    我想到了

    • 一起使用AlarmManagerJobScheduler

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

      (这有意义吗?)

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

    我真的很感激有关此事的任何建议。

2 个答案:

答案 0 :(得分:0)

在android-o及更高版本中,你可以像这样定义一个没有alarmmanager的重复任务:

var s = 0;
var songWriters = new SongWriterDetails[1];
foreach (var contributor in Contributors)
{
    Array.Resize(ref songWriters, s++);
    songWriters[s] = new SongWriterDetails();
    songWriters[s].DisplayName = contributor.Name;
    songWriters[s].PartyId = contributor.Id;
    s++;
}

答案 1 :(得分:0)

您可以使用由Alarm触发的BroadcastReciever,并在与服务的接收方调用JobIntentService.enqueueWork中使用,您需要将其转换为JobIntentService并实现onHandleWork方法。
解决方案的说明如下:
Issue Moving from IntentService to JobIntentService for Android O