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