我最近尝试使用 WorkManager
的PeriodicWorkRequest
s 作为在后台定期获取用户位置更新的可靠方法。该库满足了我的要求,这个特殊的细节引起了我的注意:
Guarantees task execution, even if the app or device restarts
实现和测试后,我尝试重新启动我的设备并注意到日志消息和应用程序通知从未出现。
自然地,我做了一些研究,偶然发现了这个:PeriodicWorkRequest not working after device reboot in android oreo
所以我尝试使用
BOOT_COMPLETED
广播接收器在设备重新启动时触发 WorkRequest,但它不起作用。我查了很多BOOT_COMPLETED
接收者关于 SO 的问题,但没有一个有效,除了这里:Broadcast Receiver Not Working After Device Reboot in Android但这涉及让用户选择您的应用程序作为 AccessibilityService在我看来,这是对 UX 的阻碍。经过一番研究,我发现 WorkManager 在后台使用 BOOT_COMPLETED BroadcastReceiver。到目前为止,我一直在 Android Nougat 和 Oreo 设备上进行测试,因此我在运行 API 16 的 Samsung 和运行 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 {
...............................
}
在那种情况下,在 list 中定义了这个 worker
<service
android:name=".RebootWorker"
android:process=":worker"/>
这将有助于让 Workmanger 在设备重启后运行您的工作服务。因为由于设备重启,您的应用程序已从任务管理器中清除。
第二种方法:您也可以使用 BroadcastReceiver 来监听 Boot 完成的 Action
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);
}
}
}
关于android - 如何确保在 Android N 及更高版本上的设备重启时调用 PeriodicWorkRequest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55305619/