Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Avoid WorkManager to run immediately?

I have a WorkManager in my mainactivity:

   private void startwork() {
        PeriodicWorkRequest work = new PeriodicWorkRequest.Builder(AlarmReceiver.class, 16, TimeUnit.MINUTES)
                .setConstraints(Constraints.NONE)
                .build();
        WorkManager.getInstance(MainActivity.this)
                .enqueueUniquePeriodicWork("workname", ExistingPeriodicWorkPolicy.REPLACE, work);
    }

I'd like to play an alert every 16 minutes. The problem is everytime user start the app it will show one alert immediately, I'd like to show the alerts only after 16 minutes the user open the app.

public Result doWork() {
notify();
}

Any ideas how to avoid this alert all the time that user opens the app, I'd like just to reschedule it to 16 minutes from now.

like image 570
RGS Avatar asked Sep 02 '25 09:09

RGS


2 Answers

The builder has a function setInitialDelay, call it as such. The default constraint is already Constraints.NONE, so setting it again has no result.

private void startwork() {
    PeriodicWorkRequest work = new PeriodicWorkRequest.Builder(AlarmReceiver.class, 16, TimeUnit.MINUTES)
            .setInitialDelay(16, TimeUnit.MINUTES)
            .build();

    WorkManager.getInstance(MainActivity.this)
            .enqueueUniquePeriodicWork("workname", ExistingPeriodicWorkPolicy.REPLACE, work);
}

As a worried potential user: do you really want to sent a notification every 16 minutes?

like image 64
Michiel Avatar answered Sep 04 '25 21:09

Michiel


You should use setInitialDelay and if you use ExistingPeriodicWorkPolicy.REPLACE when app runs it will replace your previous worker use ExistingPeriodicWorkPolicy.KEEP instead.

        PeriodicWorkRequest work = new PeriodicWorkRequest.Builder(AlarmReceiver.class, 16, TimeUnit.MINUTES)
                .setInitialDelay(16, TimeUnit.MINUTES)
                .build();
        WorkManager.getInstance(MainActivity.this)
                .enqueueUniquePeriodicWork("workname", ExistingPeriodicWorkPolicy.KEEP, work);
like image 24
Công Hải Avatar answered Sep 04 '25 21:09

Công Hải