Course Content
-
Разработка приложения Фитнес-календарь
- Описание проекта
- Разработка графического интерфейса для отображения списка запланированных тренировок
- Создание уведомления Notification
- Создание PendingIntent
- Разработка интерфейса для создания напоминания о тренировке
- Создание локальной БД для хранения информации о тренировках
- Создание BroadcastReceiver
- Создание каналов уведомлений
- Доработка методов для отображения уведомлений
- Описание Alarm Manager
- Реализация механизма напоминания через AlarmManager
- Cоздание PendingIntent и добавление его к AlarmManager.
- Выводы
Создание PendingIntent
Создание PendingIntent
В этом уроке вы познакомитесь с таким понятием как PendingIntent. Что это такое?
PendingIntent используется для описания интента, выполнение которого отложено во времени. Инстанс класса PendingIntent создается одним из статических методов: PendingIntent.getActivity(), PendingIntent.getActivities(),PendingIntent.getBroadcast(), PendingIntent.getService().
При создании в PendingIntent записывается информация о желаемом интенте и о том, какой компонент будет запущен.
Объекты PendingIntent переживают остановку процесса, поэтому система может использовать PendingIntent для старта приложения.
Один из частых примеров использования PendingIntent – это создание нотификации. Метод NotificationCompat.Builder.setContentIntent() принимает PendingIntent, который выполняется, когда пользователь кликает на нотификацию и таким образом мы можем перевести пользователя на главный экран нашего приложения или любой другой нужный экран. Для этого давайте добавим в ранее описанный метод createSampleDataNotification() следующий код:
fun createSampleDataNotification(
context: Context, title: String, message: String,
bigText: String, autoCancel: Boolean
) {
// Это описано в предыдущем уроке
val channelId = "${context.packageName}-${context.getString(R.string.app_name)}"
val notificationBuilder = NotificationCompat.Builder(context, channelId).apply {
setSmallIcon(R.drawable.ic_fitnes)
setContentTitle(title)
setContentText(message)
setAutoCancel(autoCancel)
setStyle(NotificationCompat.BigTextStyle().bigText(bigText))
priority = NotificationCompat.PRIORITY_DEFAULT
// Создаём Intent и PendingIntent для открытия главного экрана
val intent = Intent(context, MainActivity::class.java) // 1
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK // 2
val pendingIntent = PendingIntent.getActivity(context, 0, intent, 0) // 3
setContentIntent(pendingIntent) // 4
}
val notificationManager = NotificationManagerCompat.from(context)
notificationManager.notify(1001, notificationBuilder.build())
}
Строки, отмеченные цифрами с 1 по 4 – используются для создания PendingIntent. Давайте рассмотрим этот код подробнее:
- Создаём
Intentдля запуска главного экрана, то естьMainActivity. - Устанавливаем флаги для режима launchMode в котором будет запущено приложение. Наглядно о launchMode рассказано тут
- Оборачиваем
IntentвPendingIntent, используя методgetActivity()для полученияActivityкоторую необходимо запустить. - Вызываем метод
setContentIntent()для передачи созданногоPendingIntentвNotificationCompat.Builderчтобы вызвать его при нажатии на уведомление пользователем.
Отображение уведомления
Теперь осталось добавить код, который покажет уведомление. Для этого в этот же метод createSampleDataNotification() добавьте в самый конец следующий код:
// 1 val notificationManager = NotificationManagerCompat.from(context) // 2 notificationManager.notify(1001, notificationBuilder.build())
Тут мы получаем ссылку на NotificationManagerCompat и вызываем метод notify() для отображения уведомления, где 1001 – это просто некий id, который является обязательным, а notificationBuilder.build() – создаёт в итоге уведомление, которое мы так тщательно конструировали.
Отличная работа! Теперь давайте запустим наш метод и проверим его работу. Для этого добавьте вызов метода createSampleDataNotification() в обработчик для Floating Action Button
Для этого откройте класс FirstFragment и добавьте следующий код
fab.setOnClickListener {
NotificationHelper.createSampleDataNotification(
view.context, "Супер Уведомление", "Это уведомление для провеки", "", true
)
findNavController().navigate(R.id.action_FirstFragment_to_SecondFragment)
}
Теперь, по нажатию на кнопку, помимо перехода на следующий фрагмент у нас появится уведомление как показано ниже на скриншоте. Нажав на него, вы перейдёте на главный экран приложения.

Отличная работа! Вы познакомились с такими понятиями как PendingIntent, каналы для уведомлений, создали своё уведомление и теперь вы готовы двигаться дальше. В следующих уроках мы разработаем экран для добавления напоминания о тренировке и реализуем механизм автоматических уведомлений по расписанию с помощью AlarmManager
Всё, что мы сейчас сделали вы можете найти в ветке на Github ветка называется feature/02-created-sample-notification