/// <summary> /// Schedules an alarm. /// </summary> /// <param name="alarm">The alarm to be scheduled.</param> public int ScheduleAlarm(Alarm alarm) { var scheduleTime = GetNextAlarmTime(alarm.Hour, alarm.Minute); var utcTime = TimeZoneInfo.ConvertTimeToUtc(scheduleTime); var epochDif = (new DateTime(1970, 1, 1) - DateTime.MinValue).TotalSeconds; var notifyTimeInInMilliseconds = utcTime.AddSeconds(-epochDif).Ticks / 10000; var intent = new Intent(context, typeof(AlarmIntentService)); intent.PutExtra("id", alarm.Id); intent.PutExtra("year", alarm.Year); intent.PutExtra("month", alarm.Month); intent.PutExtra("day", alarm.Day); intent.PutExtra("hour", alarm.Hour); intent.PutExtra("minute", alarm.Minute); intent.PutExtra("difficulty", alarm.Difficulty); Android.Util.Log.Verbose("notifyFilter", $"register {alarm.Id}"); // adb logcat -s notifyFilter PendingIntent pendingIntent; if (Android.OS.Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.O) { pendingIntent = PendingIntent.GetForegroundService(context, alarm.Id, intent, PendingIntentFlags.UpdateCurrent); } else { pendingIntent = PendingIntent.GetService(context, alarm.Id, intent, PendingIntentFlags.UpdateCurrent); } // Set inexact repeating alarmManager.SetExactAndAllowWhileIdle(AlarmType.RtcWakeup, notifyTimeInInMilliseconds, pendingIntent); //alarmManager.SetRepeating(AlarmType.RtcWakeup, notifyTimeInInMilliseconds, AlarmManager.IntervalDay, pendingIntent); return(alarm.Id); }
/// <summary> /// Cancels the scheduled alarm. /// </summary> /// <returns>The alarm to be canceled.</returns> /// <param name="alarm">Alarm.</param> public void CancelAlarm(Alarm alarm) { var intent = new Intent(context, typeof(AlarmIntentService)); PendingIntent pendingIntent; if (Android.OS.Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.O) { pendingIntent = PendingIntent.GetForegroundService(context, alarm.Id, intent, PendingIntentFlags.UpdateCurrent); } else { pendingIntent = PendingIntent.GetService(context, alarm.Id, intent, PendingIntentFlags.UpdateCurrent); } alarmManager.Cancel(pendingIntent); }
public static PendingIntent SafeGetForegroundService(this Context context, int requestCode, Intent intent, PendingIntentFlags flags) => OreoApis.AreAvailable ? PendingIntent.GetForegroundService(context, requestCode, intent, flags) : PendingIntent.GetService(context, requestCode, intent, flags);