/// <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);
        }
Exemple #3
0
 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);