public static void ScheduleBackgroundFetch() { //The interval has to be minimum 15 minutes. //Note that execution may be delayed because WorkManager is subject to OS battery optimizations, //such as doze mode. PeriodicWorkRequest.Builder periodicWorkRequestBuilder = new PeriodicWorkRequest.Builder( typeof(BackgroundFetchWorker), Conf.BACKGROUND_FETCH_REPEAT_INTERVAL_ANDROID); periodicWorkRequestBuilder //Start time is when the first time will be .SetPeriodStartTime(TimeSpan.FromSeconds(1)) //If Result.InvokeRetry() is called it will linearly double the amount of time specified below before it tries again. .SetBackoffCriteria(BackoffPolicy.Linear, TimeSpan.FromSeconds(10)) .SetConstraints(new Constraints.Builder() //Only run if connected to the internet .SetRequiredNetworkType(NetworkType.Connected) .Build()); PeriodicWorkRequest periodicWorkRequest = periodicWorkRequestBuilder.Build(); WorkManager workManager = WorkManager.GetInstance(Platform.AppContext); workManager.EnqueueUniquePeriodicWork("exposurenotification", ExistingPeriodicWorkPolicy.Keep, periodicWorkRequest); }
private void InitMessagingCenterSubcription() { MessagingCenter.Subscribe <CalculatorWorkerRequested>(this, nameof(CalculatorWorkerRequested), message => { WorkManager workManager = WorkManager.GetInstance(Xamarin.Essentials.Platform.AppContext); PeriodicWorkRequest taxWorkRequest = PeriodicWorkRequest.Builder.From <CalculatorWorker>(TimeSpan.FromMinutes(15)).Build(); workManager.EnqueueUniquePeriodicWork(nameof(CalculatorWorker), ExistingPeriodicWorkPolicy.Replace, taxWorkRequest); }); }
public override void Schedule() { LoggerService.StartMethod(); WorkManager workManager = WorkManager.GetInstance(Platform.AppContext); PeriodicWorkRequest periodicWorkRequest = CreatePeriodicWorkRequest(); workManager.EnqueueUniquePeriodicWork( CURRENT_WORK_NAME, ExistingPeriodicWorkPolicy.Keep, periodicWorkRequest ); LoggerService.EndMethod(); }
public Task Register(string taskName, string taskEntryPoint, DateTime startDateTime, TimeKind tKind, uint interval) { if (IsRegistered(taskName)) { return(Task.CompletedTask); } try { DateTime nowNoSecond = DateTime.ParseExact(DateTime.Now.ToString("dd-MM-yyyy HH:mm:00"), "dd-MM-yyyy HH:mm:ss", System.Globalization.CultureInfo.InvariantCulture); uint initialDelay = (uint)Math.Round((startDateTime - nowNoSecond).TotalMinutes, 0); uint timeInterval = interval; Java.Util.Concurrent.TimeUnit unit = Java.Util.Concurrent.TimeUnit.Minutes; switch (tKind) { case TimeKind.Minute: unit = Java.Util.Concurrent.TimeUnit.Minutes; break; case TimeKind.Hour: unit = Java.Util.Concurrent.TimeUnit.Hours; break; case TimeKind.Day: unit = Java.Util.Concurrent.TimeUnit.Days; break; case TimeKind.Month: unit = Java.Util.Concurrent.TimeUnit.Days; timeInterval *= 30; break; case TimeKind.Year: unit = Java.Util.Concurrent.TimeUnit.Days; timeInterval *= 365; break; default: throw new Exception(string.Format("Categoria di tempo {0} non prevista", tKind)); } PeriodicWorkRequest.Builder workRequestedBuilder; if (taskName.CompareTo(App.CheckPasswordBackgroundTaskName) == 0) { workRequestedBuilder = PeriodicWorkRequest.Builder.From <CheckPasswordWorker>(timeInterval, unit); } else if (taskName.CompareTo(App.BackupBackgroundTaskName) == 0) { workRequestedBuilder = PeriodicWorkRequest.Builder.From <BackupWorker>(timeInterval, unit); } else { throw new Exception("Task not found"); } Data data = new Data.Builder() .PutLong("interval", unit.ToMinutes(timeInterval)) .Build(); PeriodicWorkRequest workRequested = (PeriodicWorkRequest)workRequestedBuilder .AddTag(taskName) .SetInitialDelay(initialDelay, Java.Util.Concurrent.TimeUnit.Minutes) .SetInputData(data) .Build(); AppWorkManager.EnqueueUniquePeriodicWork(taskName, ExistingPeriodicWorkPolicy.Replace, workRequested); } catch (Exception e) { Log.Error(Tag, string.Format("Error occurred during scheduling the work with name \"{0}\": {1}", taskName, e.Message)); } return(Task.CompletedTask); }