private void ScheduleCallbackAlarm(ScheduledCallback callback, PendingIntent callbackPendingIntent) { AlarmManager alarmManager = _service.GetSystemService(global::Android.Content.Context.AlarmService) as AlarmManager; // cancel the current alarm for this callback id. this deals with the situations where (1) sensus schedules callbacks // and is subsequently restarted, or (2) a probe is restarted after scheduling callbacks (e.g., script runner). in // these situations, the originally scheduled callbacks will remain in the alarm manager, and we'll begin piling up // additional, duplicate alarms. we need to be careful to avoid duplicate alarms, and this is how we manage it. alarmManager.Cancel(callbackPendingIntent); long callbackTimeMS = callback.NextExecution.Value.ToJavaCurrentTimeMillis(); // see the Backwards Compatibility article for more information #if __ANDROID_23__ if (Build.VERSION.SdkInt >= BuildVersionCodes.M) { alarmManager.SetExactAndAllowWhileIdle(AlarmType.RtcWakeup, callbackTimeMS, callbackPendingIntent); // API level 23 added "while idle" option, making things even tighter. } else if (Build.VERSION.SdkInt >= BuildVersionCodes.Kitkat) { alarmManager.SetExact(AlarmType.RtcWakeup, callbackTimeMS, callbackPendingIntent); // API level 19 differentiated Set (loose) from SetExact (tight) } else #endif { alarmManager.Set(AlarmType.RtcWakeup, callbackTimeMS, callbackPendingIntent); // API 1-18 treats Set as a tight alarm } SensusServiceHelper.Get().Logger.Log("Alarm scheduled for callback " + callback.Id + " at " + callback.NextExecution.Value + ".", LoggingLevel.Normal, GetType()); }
private void ScheduleCallbackAlarm(PendingIntent callbackPendingIntent, TimeSpan delay) { AlarmManager alarmManager = _service.GetSystemService(global::Android.Content.Context.AlarmService) as AlarmManager; // cancel the current alarm for this callback id. this deals with the situations where (1) sensus schedules callbacks // and is subsequently restarted, or (2) a probe is restarted after scheduling callbacks (e.g., script runner). in // these situations, the originally scheduled callbacks will remain in the alarm manager, and we'll begin piling up // additional, duplicate alarms. we need to be careful to avoid duplicate alarms, and this is how we manage it. alarmManager.Cancel(callbackPendingIntent); long callbackTimeMS = Java.Lang.JavaSystem.CurrentTimeMillis() + (long)delay.TotalMilliseconds; // https://github.com/predictive-technology-laboratory/sensus/wiki/Backwards-Compatibility #if __ANDROID_23__ if (Build.VERSION.SdkInt >= BuildVersionCodes.M) { alarmManager.SetExactAndAllowWhileIdle(AlarmType.RtcWakeup, callbackTimeMS, callbackPendingIntent); // API level 23 added "while idle" option, making things even tighter. } else if (Build.VERSION.SdkInt >= BuildVersionCodes.Kitkat) { alarmManager.SetExact(AlarmType.RtcWakeup, callbackTimeMS, callbackPendingIntent); // API level 19 differentiated Set (loose) from SetExact (tight) } else #endif { alarmManager.Set(AlarmType.RtcWakeup, callbackTimeMS, callbackPendingIntent); // API 1-18 treats Set as a tight alarm } }
protected override void UnscheduleCallbackPlatformSpecific(string callbackId) { lock (_callbackIdPendingIntent) { PendingIntent callbackPendingIntent; if (_callbackIdPendingIntent.TryGetValue(callbackId, out callbackPendingIntent)) { AlarmManager alarmManager = _service.GetSystemService(global::Android.Content.Context.AlarmService) as AlarmManager; alarmManager.Cancel(callbackPendingIntent); _callbackIdPendingIntent.Remove(callbackId); } } }
public AndroidNotifier(AndroidSensusService service) { _service = service; _notificationManager = _service.GetSystemService(global::Android.Content.Context.NotificationService) as NotificationManager; }