Course Content
-
Разработка приложения Фитнес-календарь
- Описание проекта
- Разработка графического интерфейса для отображения списка запланированных тренировок
- Создание уведомления Notification
- Создание PendingIntent
- Разработка интерфейса для создания напоминания о тренировке
- Создание локальной БД для хранения информации о тренировках
- Создание BroadcastReceiver
- Создание каналов уведомлений
- Доработка методов для отображения уведомлений
- Описание Alarm Manager
- Реализация механизма напоминания через AlarmManager
- Cоздание PendingIntent и добавление его к AlarmManager.
- Выводы
Создание уведомления Notification
Создания уведомления
Скачать готовый проект вы можете по ссылке на GitHub. Поехали!
Чтобы создать и показать уведомление пользователю, необходимо выполнить следующие шаги:
- Создать так называемый Notification channel.
- Зарегистрировать его
- Создать Notification
- Отправить уведомление, используя NotificationManager.
Создание канала уведомлений
Каналы для уведомлений необходимы для группирования уведомлений похожего типа. Начиная с 26 API для уведомлений обязательно определить канал, в противном случае они не будут показаны на новых версиях операционной системы Android. Поэтому давайте создадим NotificationHelper.kt – класс для управления уведомления и создадим метод createNotificationChannel()
fun createNotificationChannel(context: Context, importance: Int, showBadge: Boolean, name: String, description: String) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { val channelId = "${context.packageName}-$name" val channel = NotificationChannel(channelId, name, importance) channel.description = description channel.setShowBadge(showBadge) // Register the channel with the system val notificationManager = context.getSystemService(NotificationManager::class.java) notificationManager.createNotificationChannel(channel) } }
Давайте рассмотрим этот метод более подробно:
- В начале стоит проверка
Build.VERSION.SDK_INT >= Build.VERSION_CODES.O
Эта проверка необходима, так какNotificationChannel
появился только в 26 API операционной системы Android. - Необходимо создать уникальное имя для канала уведомлений. Имя и описание канала впоследствии будет отображаться в настройках уведомлений вашего приложения.
- Используя метод
createNotificationChannel
создаём канал уведомлений - Теперь осталось вызвать метод!
Регистрация канала уведомлений
Теперь необходимо зарегистрировать канал уведомлений. Для этого создайте класс-наследник от Application и назовите его FitnessApp. Не забудьте добавить в манифест приложения android:name=".FitnessApp"
AndroidManifest.xml теперь будет выглядеть так:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="ru.androidschool.fitnessnotification"> <application android:name=".FitnessApp" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity" android:label="@string/app_name" android:theme="@style/AppTheme.NoActionBar"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
В метод onCreate()
класса FitnessApp
добавьте следующий код для регистрации канала:
NotificationHelper.createNotificationChannel( this, NotificationManagerCompat.IMPORTANCE_DEFAULT, false, getString(R.string.app_name), "Канал Фитнес - приложения." )
Отлично! Теперь мы сможем отправить уведомление.
Создание уведомлений
Откройте NotificationHelper.kt file и создайте метод createSampleDataNotification()
fun createSampleDataNotification( context: Context, title: String, message: String, bigText: String, autoCancel: Boolean ) { // 1 val channelId = "${context.packageName}-${context.getString(R.string.app_name)}" // 2 val notificationBuilder = NotificationCompat.Builder(context, channelId).apply { setSmallIcon(R.drawable.ic_fitnes) // 3 setContentTitle(title) // 4 setContentText(message) // 5 setAutoCancel(autoCancel) // 6 setStyle(NotificationCompat.BigTextStyle().bigText(bigText)) // 7 priority = NotificationCompat.PRIORITY_DEFAULT // 8 val intent = Intent(context, MainActivity::class.java) intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK val pendingIntent = PendingIntent.getActivity(context, 0, intent, 0) setContentIntent(pendingIntent) } val notificationManager = NotificationManagerCompat.from(context) notificationManager.notify(1001, notificationBuilder.build()) }
Давайте рассмотрим этот метод более подробно:
- Создаём уникальный
channelId
для этого приложения, используя имя package name и приложения. - Для создания уведомления используем
NotificationCompat.Builder
- Единственным обязательным параметром при создании уведомления является иконка. С помощью метода
setSmallIcon
задаём иконку для уведомления. - Задаём заголовок для уведомления
- Задаём описание
- Указываем стиль
NotificationCompat.BigTextStyle()
. - Указываем приоритет уведомления. Существуют следующие типы уведомлений:
- PRIORITY_MIN
- PRIORTY_MAX
- PRIORITY_LOW
- PRIORTY_HIGH
- PRIORITY_DEFAULT
8. Устанавливаем уведомление как автоматически скрываемое после того, как пользователь нажмёт на уведомление.
После этого мы добавим PendingIntent для открытия приложения. Что такое PendingIntent и для чего он используется – рассмотрим в следующем уроке.