fbpx

Реализация механизма напоминания через AlarmManager

Создайте  AlarmScheduler.kt  в папке ru.androidschool.fitnessnotification.notification  и опишите метод scheduleAlarm()

private fun scheduleAlarm(reminderData: ReminderData, dayOfWeek: Int, alarmIntent: PendingIntent?, alarmMgr: AlarmManager) {

    // 1 Set up the time to schedule the alarm
    val datetimeToAlarm = Calendar.getInstance(Locale.getDefault())
    datetimeToAlarm.timeInMillis = System.currentTimeMillis()
    datetimeToAlarm.set(Calendar.HOUR_OF_DAY, reminderData.hour)
    datetimeToAlarm.set(Calendar.MINUTE, reminderData.minute)
    datetimeToAlarm.set(Calendar.SECOND, 0)
    datetimeToAlarm.set(Calendar.MILLISECOND, 0)
    datetimeToAlarm.set(Calendar.DAY_OF_WEEK, dayOfWeek)

    // 2 Compare the datetimeToAlarm to today
    val today = Calendar.getInstance(Locale.getDefault())
    if (shouldNotifyToday(dayOfWeek, today, datetimeToAlarm)) {

        // schedule for today
        alarmMgr.setRepeating(
            AlarmManager.RTC_WAKEUP,
            datetimeToAlarm.timeInMillis, (1000 * 60 * 60 * 24 * 7).toLong(), alarmIntent)
        return
    }

    // 3 schedule 1 week out from the day
    datetimeToAlarm.roll(Calendar.WEEK_OF_YEAR, 1)
    alarmMgr.setRepeating(
        AlarmManager.RTC_WAKEUP,
        datetimeToAlarm.timeInMillis, (1000 * 60 * 60 * 24 * 7).toLong(), alarmIntent)
}

Не пугайтесь, здесь много кода, однако всё очень просто.

  1. Используя  Calendar  выставляем нужное время для напоминания о тренировке, которое пользователь определил в ReminderData.
  2. Проверяем нужно ли сегодня напомнить о тренировке, если напоминание было создано сегодня
  3. В противном случае начинаем уведомлять пользователя через неделю.

Метод setRepeating()  нужен для повторяющихся оповещений. Если вам нужно, чтобы AlarmManager срабатывал один раз – то нужно использовать метод setAlarmClock()

Так как у нас несколько дней, например беговая тренировка может быть по понедельникам и четвергам – то нужен еще один метод, который будет выставлять напоминания для каждого дня.

fun scheduleAlarmsForReminder(context: Context, reminderData: ReminderData) {

      // get the AlarmManager reference
      val alarmMgr = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager

      // Schedule the alarms based on the days to administer the medicine
      val days = context.resources.getStringArray(R.array.days)
      if (reminderData.days != null) {
          for (index in reminderData.days!!.indices) {

              val day = reminderData.days!![index]
              if (day != null) {

                  // get the PendingIntent for the alarm
                  val alarmIntent = createPendingIntent(context, reminderData, day)

                  // schedule the alarm
                  val dayOfWeek = getDayOfWeek(days, day)
                  scheduleAlarm(reminderData, dayOfWeek, alarmIntent, alarmMgr)
              }
          }
      }
  }

В следующем уроке мы создадим PendingIntent для перехода в приложение