Course Content
-
Разработка приложения Фитнес-календарь
- Описание проекта
- Разработка графического интерфейса для отображения списка запланированных тренировок
- Создание уведомления Notification
- Создание PendingIntent
- Разработка интерфейса для создания напоминания о тренировке
- Создание локальной БД для хранения информации о тренировках
- Создание BroadcastReceiver
- Создание каналов уведомлений
- Доработка методов для отображения уведомлений
- Описание Alarm Manager
- Реализация механизма напоминания через AlarmManager
- Cоздание PendingIntent и добавление его к AlarmManager.
- Выводы
Доработка методов для отображения уведомлений
Создайте класс NotificationHelper в папке notification и создайте метод buildGroupNotification()
private fun buildGroupNotification(
context: Context,
reminderData: ReminderData
): NotificationCompat.Builder {
val channelId = "${context.packageName}-${reminderData.type.name}"
return NotificationCompat.Builder(context, channelId).apply {
setSmallIcon(R.drawable.ic_fitnes)
setContentTitle(reminderData.type.name)
setContentText(
context.getString(
R.string.group_notification_for,
reminderData.type.name
)
)
setStyle(
NotificationCompat.BigTextStyle().bigText(
context.getString(
R.string.group_notification_for,
reminderData.type.name
)
)
)
setAutoCancel(true)
setGroupSummary(true)
setGroup(reminderData.type.name)
}
}
Групповые уведомления позволяют удобно организовать уведомления похожей группы вместе. Теперь создайте метод для создания уведомления для напоминания о тренировке. Cоздайте метод buildNotification() как показано ниже:
private fun buildNotification(
context: Context,
reminderData: ReminderData
): NotificationCompat.Builder {
// 1
val channelId = "${context.packageName}-${reminderData.type.name}"
// 2
return NotificationCompat.Builder(context, channelId).apply {
// 3
setSmallIcon(R.drawable.ic_fitnes)
// 4
setContentTitle(reminderData.name)
// 5
setAutoCancel(true)
// 6 get a drawable reference for the LargeIcon
val drawable = when (reminderData.type) {
WorkoutType.Running -> R.drawable.ic_run
WorkoutType.Cycling -> R.drawable.ic_velo
else -> R.drawable.ic_swimming
}
setLargeIcon(BitmapFactory.decodeResource(context.resources, drawable))
// 7
setContentText("${reminderData.name}")
// 8
setGroup(reminderData.type.name)
// 9 Launches the app to open the reminder edit screen when tapping the whole notification
val intent = Intent(context, MainActivity::class.java).apply {
flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
putExtra(KEY_ID, reminderData.id)
}
// 10
val pendingIntent = PendingIntent.getActivity(context, 0, intent, 0)
setContentIntent(pendingIntent)
}
}
Здесь мы используем все те же методы, которые рассматривали в самом начале для создания тестового уведомления.
- Создаём уникальный
channelIdдля этого приложения, используя имя package name и название из ReminderData. - Для создания уведомления используем
NotificationCompat.Builder - Единственным обязательным параметром при создании уведомления является иконка. С помощью метода
setSmallIconзадаём иконку для уведомления. - Задаём заголовок для уведомления
- Устанавливаем уведомление как автоматически скрываемое после того, как пользователь нажмёт на уведомление.
- Получаем иконку по типу из ReminderData
- Задаём описание
- Задаём группу
- Задаём интент, который должен выполниться.
- Указываем отложенный интент
Теперь давайте создадим метод createNotificationForWorkout() который использует выше описанные методы для создания уведомление о тренировке.
fun createNotificationForWorkout(context: Context, reminderData: ReminderData) {
// 1 create a group notification
val groupBuilder = buildGroupNotification(context, reminderData)
// 2
val notificationBuilder = buildNotification(context, reminderData)
// 3
val notificationManager = NotificationManagerCompat.from(context)
notificationManager.notify(reminderData.type.ordinal, groupBuilder.build())
notificationManager.notify(reminderData.id.toInt(), notificationBuilder.build())
}
Давайте рассмотрим подробнее что здесь происходит:
- Создаём групповое уведомлений. Метод
buildGroupNotification()мы описали выше - Создаём уведомление.
- Вызываем метод notify используя
NotificationManagerдля обоих типов уведомлений
Предыдущий
Создание каналов уведомлений
Следующий
Описание Alarm Manager