避免从 WorkManager 复制 PeriodicWorkRequest
Avoiding duplicating PeriodicWorkRequest from WorkManager
在应用程序启动时,我想启动将永远有效的服务,但是当用户再次打开应用程序时,它会重复。
PeriodicWorkRequest.Builder sendDataBuilder = new PeriodicWorkRequest.Builder(SendConnectionMetricsWorker.class, Constants.REPEAT_TIME_INTERVAL_IN_HOURS, Constants.REPEAT_TIME_INTERVAL_UNITS)
.setConstraints(new Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build());
PeriodicWorkRequest periodicWorkRequest = sendDataBuilder
.build();
WorkManager.getInstance().enqueue(periodicWorkRequest);
您可以使用 enqueueUniquePeriodicWork
而不是 enqueue
。基于文档:
This method allows you to enqueue a uniquely-named
PeriodicWorkRequest, where only one PeriodicWorkRequest of a
particular name can be active at a time. For example, you may only
want one sync operation to be active. If there is one pending, you can
choose to let it run or replace it with your new work. The
uniqueWorkName uniquely identifies this PeriodicWorkRequest.
您可以通过以下方式实现:
PeriodicWorkRequest.Builder sendDataBuilder = new PeriodicWorkRequest.Builder(SendConnectionMetricsWorker.class, Constants.REPEAT_TIME_INTERVAL_IN_HOURS, Constants.REPEAT_TIME_INTERVAL_UNITS)
.setConstraints(new Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build());
PeriodicWorkRequest periodicWorkRequest = sendDataBuilder
.build();
WorkManager.getInstance().enqueueUniquePeriodicWork("Send Data", ExistingPeriodicWorkPolicy.KEEP,periodicWorkRequest);
注:
ExistingPeriodicWorkPolicy.REPLACE
确保如果有标记为 uniqueWorkName 的待处理工作,它将被取消,新工作将 运行。 ExistingPeriodicWorkPolicy.KEEP
仅当没有标有 uniqueWorkName 的未决工作时才会 运行 新的 PeriodicWorkRequest。
在应用程序启动时,我想启动将永远有效的服务,但是当用户再次打开应用程序时,它会重复。
PeriodicWorkRequest.Builder sendDataBuilder = new PeriodicWorkRequest.Builder(SendConnectionMetricsWorker.class, Constants.REPEAT_TIME_INTERVAL_IN_HOURS, Constants.REPEAT_TIME_INTERVAL_UNITS)
.setConstraints(new Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build());
PeriodicWorkRequest periodicWorkRequest = sendDataBuilder
.build();
WorkManager.getInstance().enqueue(periodicWorkRequest);
您可以使用 enqueueUniquePeriodicWork
而不是 enqueue
。基于文档:
This method allows you to enqueue a uniquely-named PeriodicWorkRequest, where only one PeriodicWorkRequest of a particular name can be active at a time. For example, you may only want one sync operation to be active. If there is one pending, you can choose to let it run or replace it with your new work. The uniqueWorkName uniquely identifies this PeriodicWorkRequest.
您可以通过以下方式实现:
PeriodicWorkRequest.Builder sendDataBuilder = new PeriodicWorkRequest.Builder(SendConnectionMetricsWorker.class, Constants.REPEAT_TIME_INTERVAL_IN_HOURS, Constants.REPEAT_TIME_INTERVAL_UNITS)
.setConstraints(new Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build());
PeriodicWorkRequest periodicWorkRequest = sendDataBuilder
.build();
WorkManager.getInstance().enqueueUniquePeriodicWork("Send Data", ExistingPeriodicWorkPolicy.KEEP,periodicWorkRequest);
注:
ExistingPeriodicWorkPolicy.REPLACE
确保如果有标记为 uniqueWorkName 的待处理工作,它将被取消,新工作将 运行。 ExistingPeriodicWorkPolicy.KEEP
仅当没有标有 uniqueWorkName 的未决工作时才会 运行 新的 PeriodicWorkRequest。