WorkManager:使用 AlarmManager 时如何处理网络约束?
WorkManager: how is network constraint handled when AlarmManager is used?
对于 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 < 21 依赖于 AlarmManager 时,网络约束实际上是如何处理的呢?如果在没有网络时触发警报,会发生什么情况?到目前为止,我有限的经验是这没有得到很好的处理(或根本没有),我想知道是否需要通过收听 CONNECTIVITY_CHANGE
?
手动处理网络约束
WorkManager 已经在侦听 CONNECTIVITY_CHANGE
- 仅仅因为它使用警报并不意味着这是它使用的唯一信号。您无需手动执行任何操作; WorkManager 为您完成所有约束跟踪。
对于 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 < 21 依赖于 AlarmManager 时,网络约束实际上是如何处理的呢?如果在没有网络时触发警报,会发生什么情况?到目前为止,我有限的经验是这没有得到很好的处理(或根本没有),我想知道是否需要通过收听 CONNECTIVITY_CHANGE
?
WorkManager 已经在侦听 CONNECTIVITY_CHANGE
- 仅仅因为它使用警报并不意味着这是它使用的唯一信号。您无需手动执行任何操作; WorkManager 为您完成所有约束跟踪。