diff --git a/event-handler/src/main/java/com/optimizely/ab/android/event_handler/EventRescheduler.java b/event-handler/src/main/java/com/optimizely/ab/android/event_handler/EventRescheduler.java index fc051c207..3fbb796ec 100644 --- a/event-handler/src/main/java/com/optimizely/ab/android/event_handler/EventRescheduler.java +++ b/event-handler/src/main/java/com/optimizely/ab/android/event_handler/EventRescheduler.java @@ -101,8 +101,11 @@ void reschedule(@NonNull Context context, @NonNull Intent broadcastIntent, @NonN // with wifi the service will be rescheduled on the interval. // Wifi connection state changes all the time and starting services is expensive // so it's important to only do this if we have stored events. - ServiceScheduler.startService(context, EventIntentService.JOB_ID, eventServiceIntent); - logger.info("Preemptively flushing events since wifi became available"); + // In android O and higher, we use a persistent job so we do not need to restart. + if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { + ServiceScheduler.startService(context, EventIntentService.JOB_ID, eventServiceIntent); + logger.info("Preemptively flushing events since wifi became available"); + } } } else { logger.warn("Received unsupported broadcast action to event rescheduler"); diff --git a/shared/src/main/java/com/optimizely/ab/android/shared/ServiceScheduler.java b/shared/src/main/java/com/optimizely/ab/android/shared/ServiceScheduler.java index 1429c5980..490c9c96f 100644 --- a/shared/src/main/java/com/optimizely/ab/android/shared/ServiceScheduler.java +++ b/shared/src/main/java/com/optimizely/ab/android/shared/ServiceScheduler.java @@ -33,6 +33,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.stream.Collectors; + import static android.app.job.JobScheduler.RESULT_SUCCESS; /** @@ -273,6 +275,12 @@ public static void startService(Context context, Integer jobId, Intent intent) { .build(); JobScheduler jobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); + if (jobScheduler.getAllPendingJobs().stream().filter(job -> job.getId() == jobId && job.getExtras().equals(intent.getExtras())).count() > 0) { + // already pending job. don't run again + LoggerFactory.getLogger("ServiceScheduler").info("Job already pending"); + return; + } + JobWorkItem jobWorkItem = new JobWorkItem(intent); try { jobScheduler.enqueue(jobInfo, jobWorkItem);