Push-уведомления
Отправляйте push-уведомления через Firebase Cloud Messaging. Настройте FCM, создавайте каналы уведомлений, добавляйте действия и обрабатывайте доставку в активном и фоновом режимах.
«Push-уведомления» — бесплатный урок Android Academy на CoddyKit. Это урок 4 из 6. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Android Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Android Academy содержит 6 уроков всего.
Что такое push-уведомления
Push-уведомления позволяют серверу отправлять сообщения пользователям, даже когда приложение не открыто на переднем плане. Распространённые варианты использования:
- уведомления о новых сообщениях;
- обновления статуса заказа;
- экстренные новости;
- напоминания и рекламные предложения.
В Android стандартной службой доставки push-уведомлений является Firebase Cloud Messaging (FCM).
Обзор FCM
Принцип работы Firebase Cloud Messaging (FCM):
- При первом запуске приложение регистрируется в FCM и получает токен устройства
- Приложение отправляет токен на Ваш сервер
- Когда требуется отправить push-уведомление, Ваш сервер отправляет сообщение в FCM
- FCM доставляет его на устройство
FCM — бесплатная и надёжная служба, работающая даже после завершения приложения.
Добавление Firebase в проект
Действия для добавления Firebase:
- Откройте Firebase Console → Add project → Add Android app
- Зарегистрируйте приложение, указав имя пакета
- Скачайте
google-services.jsonи поместите его вapp/ - Добавьте плагины и зависимости
// project/build.gradle:
buildscript {
dependencies { classpath 'com.google.gms:google-services:4.4.1' }
}
// app/build.gradle:
plugins { id 'com.google.gms.google-services' }
dependencies {
implementation platform('com.google.firebase:firebase-bom:32.7.4')
implementation 'com.google.firebase:firebase-messaging-ktx'
}Разрешение FCM (Android 13+)
Начиная с Android 13 (API 33), необходимо запрашивать разрешение POST_NOTIFICATIONS во время работы приложения — так же, как опасное разрешение:
<!-- AndroidManifest.xml -->
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
// In Activity (Android 13+):
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
requestPermissionLauncher.launch(android.Manifest.permission.POST_NOTIFICATIONS)
}FirebaseMessagingService
Создайте службу, которая обрабатывает входящие сообщения FCM и обновления токена:
class MyFirebaseService : FirebaseMessagingService() {
override fun onNewToken(token: String) {
// Send token to your backend to enable push delivery
sendTokenToServer(token)
}
override fun onMessageReceived(message: RemoteMessage) {
val title = message.notification?.title ?: "New Message"
val body = message.notification?.body ?: ""
showNotification(title, body)
}
}Регистрация службы в манифесте
Объявите службу в AndroidManifest.xml:
<service
android:name=".MyFirebaseService"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>Каналы уведомлений (Android 8+)
Начиная с Android 8 (Oreo), уведомления должны быть назначены каналу. Пользователи могут отдельно управлять звуком, вибрацией и важностью каждого канала:
fun createNotificationChannel(context: Context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val channel = NotificationChannel(
"messages_channel", // channel ID
"Messages", // user-visible name
NotificationManager.IMPORTANCE_HIGH
).apply {
description = "Incoming message notifications"
enableVibration(true)
}
val manager = context.getSystemService(NotificationManager::class.java)
manager.createNotificationChannel(channel)
}
}Создание и отображение уведомления
Используйте NotificationCompat.Builder для совместимости с разными версиями Android:
fun showNotification(context: Context, title: String, body: String) {
val intent = Intent(context, MainActivity::class.java)
val pendingIntent = PendingIntent.getActivity(
context, 0, intent,
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
)
val notification = NotificationCompat.Builder(context, "messages_channel")
.setSmallIcon(R.drawable.ic_notification)
.setContentTitle(title)
.setContentText(body)
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setAutoCancel(true) // dismiss on tap
.setContentIntent(pendingIntent) // open app on tap
.build()
NotificationManagerCompat.from(context)
.notify(System.currentTimeMillis().toInt(), notification)
}Уведомление с действиями
Добавляйте к уведомлениям кнопки действий, чтобы пользователи могли выполнить действие, не открывая приложение:
val replyIntent = Intent(context, ReplyReceiver::class.java)
val replyPending = PendingIntent.getBroadcast(
context, 1, replyIntent,
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
)
val notification = NotificationCompat.Builder(context, "messages_channel")
.setSmallIcon(R.drawable.ic_notification)
.setContentTitle("New message from Alice")
.setContentText("Hey, are you coming?")
.addAction(R.drawable.ic_reply, "Reply", replyPending)
.addAction(R.drawable.ic_dismiss, "Dismiss", null)
.build()Обработка на переднем и заднем плане
Поведение FCM зависит от состояния приложения:
- Приложение на переднем плане — вызывается
onMessageReceived(); уведомление необходимо создать и показать самостоятельно - Приложение в фоне или завершено — FCM автоматически показывает уведомление из полезной нагрузки
notification;onMessageReceivedНЕ вызывается
Помещайте дополнительные данные в полезную нагрузку data (а не в notification), чтобы всегда получать их в onMessageReceived.
Получение токена FCM
Получите текущий токен FCM, чтобы отправить его на Ваш сервер:
FirebaseMessaging.getInstance().token.addOnCompleteListener { task ->
if (!task.isSuccessful) {
Log.w("FCM", "Fetching token failed", task.exception)
return@addOnCompleteListener
}
val token = task.result
Log.d("FCM", "Token: $token")
// Send token to your server
sendTokenToServer(token)
}Быстрая проверка
Что произойдёт, если приложение находится в фоне, а FCM доставляет сообщение с полезной нагрузкой «notification»?
Итоги: push-уведомления
Push-уведомления с FCM в Android:
- Добавьте Firebase,
google-services.jsonиfirebase-messaging-ktx - Запрашивайте
POST_NOTIFICATIONSв Android 13+ - Создайте
FirebaseMessagingService→onNewToken+onMessageReceived - Создайте
NotificationChannelдля Android 8+ - Создавайте уведомления с помощью
NotificationCompat.Builder - Используйте полезную нагрузку data, чтобы всегда получать данные в
onMessageReceived
Далее: планирование фоновых задач с помощью WorkManager.
Часто задаваемые вопросы
Урок «Push-уведомления» бесплатный?
Да — полный текст урока «Push-уведомления» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Android Academy, подпишись на CoddyKit PRO. Курс Android Academy содержит 6 уроков всего.
Чему я научусь в уроке «Push-уведомления»?
Отправляйте push-уведомления через Firebase Cloud Messaging. Настройте FCM, создавайте каналы уведомлений, добавляйте действия и обрабатывайте доставку в активном и фоновом режимах. Ты практикуешь Android Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Android Academy?
Предыдущий опыт не требуется. Android Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 6.
Сколько времени занимает урок «Push-уведомления»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Android Academy?
Да. Каждый урок Android Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Retrofit и REST API
- Загрузка изображений с Coil
- Обработка ошибок и UX
- Push-уведомления
- WorkManager и фоновые задачи
- Публикация в Play Store