如何确保在Android N及更高版本的设备上重新启动时调用PeriodicWorkRequests



我最近尝试使用WorkManagerPeriodicWorkRequest作为在后台定期获取用户位置更新的可靠方法。图书馆满足了我的要求,这个特别的细节引起了我的注意:

保证任务执行,即使应用或设备重新启动也是如此

实施并测试后,我尝试重新启动设备,并注意到日志消息和应用程序通知从未出现。

自然,我做了一些研究并偶然发现了这个:在安卓奥利奥中设备重启后,PeriodicWorkRequest 不起作用

所以我尝试使用BOOT_COMPLETED广播接收器在设备重新启动时触发工作请求,但它不起作用。我在 SO 上检查了许多BOOT_COMPLETED接收器问题,但没有一个有效,除了这里:在 Android 中设备重启后广播接收器不起作用,但这涉及让用户选择您的应用程序作为辅助功能服务,在我看来,这是对用户体验的障碍。

经过一些研究,我发现WorkManager在引擎盖下使用BOOT_COMPLETED BroadcastReceiver。到目前为止,我一直在Android Nougat和Oreo设备上进行测试,所以我在运行API 16的三星以及运行API 22的HTC上测试了BroadcastReceiver。接收器工作了,我删除了它们,并在重新启动时测试了工作请求;他们也工作了!

以下是我如何实现我的PeriodicWorkRequest

PeriodicWorkRequest request =
new PeriodicWorkRequest.Builder(LocationListenerWorker.class,
12, HOURS)
.build();
mWorkManager.enqueueUniquePeriodicWork(Constants.LOCATION_TASK_ID,
ExistingPeriodicWorkPolicy.REPLACE, request);

有关如何确保在运行API 24+的设备上重新启动设备时也调用请求的任何帮助将不胜感激

假设您定义了一个 RebootWorker 类,该类扩展了 Worker 并在设备重新启动后执行一些特定的作业。 第一种方法:

public class RebootWorker extends Worker {
...............................
}

在这种情况下,在清单中定义了此辅助角色

<service
android:name=".RebootWorker"
android:process=":worker"/> 

这将有助于让Workmanger在设备重新启动后运行您的工作器服务。因为由于设备重新启动,您的应用程序已从任务管理器中清除。

第二种方法:也可以使用广播接收器监听启动完成的操作

public class MyReceiver extends BroadcastReceiver {
WorkManager mWorkManager;
PeriodicWorkRequest rebootRequest;
@Override
public void onReceive(Context context, Intent intent) {
Log.i(MainActivity.TAG, "intent.getAction(): "+intent.getAction());
//Reboot worker
mWorkManager = WorkManager.getInstance(context);
rebootRequest = new PeriodicWorkRequest.Builder(RebootWorker.class,
MainActivity.REPEAT_INTERVAL, MainActivity.TIME).build();
if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {
//do your work and enqueue it 
mWorkManager.enqueue(rebootRequest);
}
}
}

最新更新