我最近尝试使用WorkManager
的PeriodicWorkRequest
作为在后台周期性获取用户位置更新的一种可靠方法。这个库符合我的要求,特别是以下细节引起了我的注意:
即使应用程序或设备重新启动,也保证任务执行
在实施和测试之后,我尝试重新启动我的设备并注意到日志消息和应用通知从未显示出来。
自然而然地,我进行了一些调查,并偶然发现了这个:Android Oreo中的设备重启后PeriodicWorkRequest无法正常工作问题
因此,我尝试使用BOOT_COMPLETED
广播接收器在设备重启时触发WorkRequest,但它没有起作用。我在SO上检查了许多BOOT_COMPLETED
接收器的问题,但除了这里的一个解决方案外:Android设备重启后广播接收器不起作用,但那需要使用户选择您的应用作为AccessibilityService,我认为这会影响用户体验。
经过一些调查,我发现WorkManager在内部使用BOOT_COMPLETED
广播接收器。到目前为止,我已经在Android Nougat和Oreo设备上进行了测试,因此我在运行API 16的三星和运行API 22的HTC上测试了广播接收器。接收器可以正常工作,我将其删除并同时测试了重启时的WorkRequests;它们也可以正常工作!
以下是我如何实现我的PeriodicWorkRequest
PeriodicWorkRequest request =
new PeriodicWorkRequest.Builder(LocationListenerWorker.class,
12, HOURS)
.build();
mWorkManager.enqueueUniquePeriodicWork(Constants.LOCATION_TASK_ID,
ExistingPeriodicWorkPolicy.REPLACE, request);
希望能得到关于如何确保在运行API 24+的设备上,请求在设备重新启动时也会被调用的任何帮助。