Course Content
-
Разработка приложения Фитнес-календарь
- Описание проекта
- Разработка графического интерфейса для отображения списка запланированных тренировок
- Создание уведомления Notification
- Создание PendingIntent
- Разработка интерфейса для создания напоминания о тренировке
- Создание локальной БД для хранения информации о тренировках
- Создание BroadcastReceiver
- Создание каналов уведомлений
- Доработка методов для отображения уведомлений
- Описание Alarm Manager
- Реализация механизма напоминания через AlarmManager
- Cоздание PendingIntent и добавление его к AlarmManager.
- Выводы
Реализация механизма напоминания через 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) }
Не пугайтесь, здесь много кода, однако всё очень просто.
- Используя
Calendar
выставляем нужное время для напоминания о тренировке, которое пользователь определил в ReminderData. - Проверяем нужно ли сегодня напомнить о тренировке, если напоминание было создано сегодня
- В противном случае начинаем уведомлять пользователя через неделю.
Метод 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 для перехода в приложение
Предыдущий
Описание Alarm Manager