避免从 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。