首页 > 解决方案 > 避免从 WorkManager 复制 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);

标签: androidandroid-workmanager

解决方案


您可以使用enqueueUniquePeriodicWork而不是enqueue. 根据文档:

此方法允许您将唯一命名的 PeriodicWorkRequest 排入队列,其中一次只能激活一个特定名称的 PeriodicWorkRequest。例如,您可能只希望一个同步操作处于活动状态。如果有一个待处理,您可以选择让它运行或用您的新工作替换它。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().enqueueUniquePeriodicWork("Send Data",  ExistingPeriodicWorkPolicy.KEEP,periodicWorkRequest);

笔记:

ExistingPeriodicWorkPolicy.REPLACE确保如果有标记为 uniqueWorkName 的待处理工作,它将被取消并运行新工作。ExistingPeriodicWorkPolicy.KEEP仅当没有标有 uniqueWorkName 的待处理工作时,才会运行新的 PeriodicWorkRequest。


推荐阅读