【发布时间】:2018-12-19 04:54:56
【问题描述】:
对于 21 之前的 Android 版本,WorkManager 似乎在后台使用了 AlarmManager,因为 JobScheduler 不可用。参见例如here.
但是在使用 WorkManager 设置网络约束时,如下所示:
Constraints.Builder constraintsBuilder = new Constraints.Builder();
constraintsBuilder.setRequiredNetworkType(NetworkType.CONNECTED);
Constraints constraints = constraintsBuilder.build();
OneTimeWorkRequest.Builder workRequestBuilder = new OneTimeWorkRequest.Builder(MyWorker.class);
workRequestBuilder.setInitialDelay(5000, TimeUnit.MILLISECONDS);
workRequestBuilder.setConstraints(constraints);
使用 JobScheduler 的行为似乎是计划的作业将坐在那里,直到网络恢复,然后它会立即触发,因为现在满足了约束。
但是警报有点不同,自然没有相关的约束。那么当 Android CONNECTIVITY_CHANGE 来手动处理网络约束?
【问题讨论】:
-
警报可以简单地检查互联网,如果没有找到,重新安排。
-
@GabeSechan 但重新安排时间?假设我从现在开始安排 6 个小时的工作(警报),并且在 6 个小时后警报触发(没有网络) WorkManager 可以做出什么明智的决定来重新安排警报?还有六个小时?任意 5 分钟、1 分钟还是什么?
-
您将不得不深入研究操作系统代码才能弄清楚这一点,我希望它会随着时间的推移而改变,作为实现细节。但是我希望 JobScheduler 没有更好的工作——它们都是写在 AlarmManager 之上的层,它们不是真正的自下而上的替代品。
-
WorkManager 已经在监听
CONNECTIVITY_CHANGE。您无需做任何其他事情。
标签: android android-jetpack android-workmanager