【发布时间】:2017-09-19 13:03:12
【问题描述】:
我的应用使用这种经典模式来安排周期性任务:
- 通过
AlarmManager设置准确的闹钟(通过setExactAndAllowWhileIdle(),因为即使在打瞌睡时它也必须响起) - 从
onReceive()通过WakefulBroadcastReceiver.startWakefulService()开始一个IntentService - 在
onHandleIntent()中完成工作,完成后致电WakefulBroadcastReceiver.completeWakefulIntent()。
今天我将 targetSdkVersion 更新为 26,并面临一个可怕的事实,即 WakefulBroadcastReceiver 已被弃用。
我立即去阅读 API 文档,发现如下:
从 Android O 开始,背景检查限制使此类没有 更长的时间一般有用。 (启动服务一般是不安全的 从收到广播开始,因为你没有任何保证 您的应用程序此时处于前台,因此允许 这样做。)相反,开发人员应该使用
android.app.job.JobScheduler安排工作,这不需要应用程序保持唤醒 这样做时锁定(系统将负责保持唤醒锁定 工作)。
这让我有点困惑,我真的不明白AlarmManager.setExactAndAllowWhileIdle() 的目的是什么,而无法再让设备保持唤醒状态。
正如我所见,我无法使用JobScheduler 设置运行作业的确切时间,只能设置条件(例如网络类型或充电状态),所以我不知道在这里做什么。
我也想过
-
同时使用
AlarmManager和JobScheduler设置警报(使用
setExactAndAllowWhileIdle())并立即从onReceive()开始工作(通过JobScheduler)。由于JobScheduler提供了WakeLock,因此不需要WakefulBroadcastReceiver。(这有意义吗?)
或
- 尽管
WakefulBroadcastReceiver已被弃用,但请继续使用。
我非常感谢您对此事的任何建议。
【问题讨论】:
-
你找到否定答案了吗???
-
现在最好直接使用 Jetpack 的 WorkManager 而不是 JobScheduler。 afaik,仍然没有方法可以设置调度工作的确切时间,因此将
AlarmManger和WorkManager.OneTimeWorkRequest结合起来,正如您所暗示的那样,似乎仍然是在精确时间“可能”完成任务的方法video
标签: android android-jobscheduler