我的应用使用此经典模式来安排定期任务:
AlarmManager
(通过setExactAndAllowWhileIdle()
设置确切的闹钟,因为即使在Doze中也必须关闭)IntentService
通过onReceive()
WakefulBroadcastReceiver.startWakefulService()
onHandleIntent()
中的工作并在完成后致电WakefulBroadcastReceiver.completeWakefulIntent()
。今天我将targetSdkVersion更新为26并面临 WakefulBroadcastReceiver
已被弃用的可怕事实。
我立即阅读了API文档并找到了以下内容:
从Android O开始,后台检查限制使这个类没有 更长的一般有用。 (启动服务通常不安全 从收到广播,因为你没有任何保证 您的应用程序此时处于前台,因此允许 这样做。)相反,开发人员应该使用
android.app.job.JobScheduler
安排工作,这不要求应用程序保持唤醒 这样做时锁定(系统将负责保持唤醒锁定 为了这份工作)。
这对我来说有点让人困惑,我真的不明白AlarmManager.setExactAndAllowWhileIdle()
的目的是什么,而不能再让设备保持清醒状态。
正如我所知,我无法确定使用JobScheduler
运行作业的确切时间,只有条件(例如网络类型或充电状态),所以我不知道该怎么做。
我想到了
一起使用AlarmManager
和JobScheduler
设置闹钟(使用setExactAndAllowWhileIdle()
)并立即从JobScheduler
开始作业(通过onReceive()
)。由于JobScheduler
提供WakeLock
,因此不需要WakefulBroadcastReceiver
。
(这有意义吗?)
或
WakefulBroadcastReceiver
。我真的很感激有关此事的任何建议。
答案 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