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