避免从WorkManager复制PeriodicWorkRequest

Igo*_*nko 6 android android-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);
Run Code Online (Sandbox Code Playgroud)

Sag*_*gar 19

你可以用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);
Run Code Online (Sandbox Code Playgroud)

注意:

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

  • 我的“enqueueUniquePeriodicWork”只工作(同步数据)几次。之后,即使使用保留或替换策略,它也不再同步,没有任何限制......有什么想法吗? (2认同)