アプリケーションの起動時に永久に機能するサービスを開始したいのですが、ユーザーがアプリを再度開くと重複します。
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
を使用できます。ドキュメントに基づく:
このメソッドを使用すると、一意の名前のPeriodicWorkRequestをキューに入れることができます。この場合、特定の名前の1つのPeriodicWorkRequestのみを一度にアクティブにできます。たとえば、1つの同期操作のみをアクティブにしたい場合があります。 保留中のものがある場合は、実行するか、新しい作業に置き換えるかを選択できます。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を実行します。