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