Отправка уведомлений через Cloud Messaging
Отправляйте и получайте уведомления FCM
«Отправка уведомлений через Cloud Messaging» — бесплатный урок Android Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Android Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Android Academy содержит 4 уроков всего.
Что такое Cloud Messaging?
Firebase Cloud Messaging (FCM) доставляет в приложение push-уведомления и сообщения с данными — даже когда приложение закрыто.
Процесс прост:
- Каждая установка приложения получает уникальный регистрационный токен.
- Ваш сервер (или консоль Firebase) отправляет сообщение этому токену или теме.
- FCM направляет его на устройство, где оно отображается или обрабатывается.
Добавление зависимости для обмена сообщениями
FCM входит в библиотеку firebase-messaging; её версия определяется настроенной ранее спецификацией BoM.
Если BoM подключена, указывать номер версии не нужно.
// app/build.gradle.kts
dependencies {
implementation(platform("com.google.firebase:firebase-bom:33.1.0"))
implementation("com.google.firebase:firebase-messaging")
}Разрешение на уведомления
В Android 13 (API 33) и более новых версиях для отправки уведомлений требуется разрешение во время выполнения POST_NOTIFICATIONS.
Объявите его в манифесте, а затем запросите во время выполнения — без предоставленного разрешения уведомления будут молча отброшены.
<!-- AndroidManifest.xml -->
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />Запрос разрешения
Используйте API Activity Result, чтобы запросить POST_NOTIFICATIONS во время выполнения. Запрашивайте его только в API 33 и новее; в старых версиях оно предоставляется автоматически.
import android.Manifest
import android.os.Build
import androidx.activity.result.contract.ActivityResultContracts
val requestPermission = registerForActivityResult(
ActivityResultContracts.RequestPermission()
) { granted ->
println(if (granted) "Notifications allowed" else "Notifications denied")
}
fun askNotificationPermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
requestPermission.launch(Manifest.permission.POST_NOTIFICATIONS)
}
}Регистрационный токен
Каждая установка имеет уникальный токен FCM, который идентифицирует её как получателя. Получите его с помощью Firebase.messaging.token.
Отправьте этот токен на свой сервер, чтобы он мог отправлять сообщения на конкретное устройство. Токены могут изменяться, поэтому всегда считайте последний токен актуальным.
import com.google.firebase.Firebase
import com.google.firebase.messaging.messaging
import kotlinx.coroutines.tasks.await
suspend fun currentToken(): String {
return Firebase.messaging.token.await()
}Сервис обмена сообщениями
Чтобы получать сообщения, расширьте FirebaseMessagingService. Переопределите onMessageReceived для обработки входящих данных и onNewToken для реакции на смену токена.
Зарегистрируйте сервис в манифесте с фильтром намерений FCM.
import com.google.firebase.messaging.FirebaseMessagingService
import com.google.firebase.messaging.RemoteMessage
class MyFcmService : FirebaseMessagingService() {
override fun onNewToken(token: String) {
// Upload the fresh token to your backend
sendTokenToServer(token)
}
override fun onMessageReceived(message: RemoteMessage) {
val title = message.notification?.title ?: "New message"
val body = message.notification?.body ?: ""
showNotification(title, body)
}
private fun sendTokenToServer(token: String) { /* ... */ }
private fun showNotification(title: String, body: String) { /* ... */ }
}Регистрация сервиса
Объявите сервис в манифесте, чтобы Android мог доставлять ему сообщения. Фильтр намерений MESSAGING_EVENT обязателен.
<!-- AndroidManifest.xml inside <application> -->
<service
android:name=".MyFcmService"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>Уведомления и сообщения с данными
Сообщения FCM бывают двух типов:
- Уведомления — FCM автоматически показывает их в области уведомлений, когда приложение работает в фоновом режиме;
onMessageReceivedвызывается только на переднем плане. - Сообщения с данными — всегда доставляются в
onMessageReceivedв виде карты «ключ/значение», поэтому вы сами управляете их обработкой.
Читайте пользовательские поля из message.data.
import com.google.firebase.messaging.RemoteMessage
fun handle(message: RemoteMessage) {
val type = message.data["type"] // your custom field
val itemId = message.data["itemId"]
when (type) {
"chat" -> openChat(itemId)
"promo" -> openPromo(itemId)
}
}
fun openChat(id: String?) {}
fun openPromo(id: String?) {}Создание канала уведомлений
Начиная с Android 8, каждому уведомлению нужен канал. Создайте его один раз при запуске; система использует канал для управления звуком, важностью и настройками пользователя для этого канала.
import android.app.NotificationChannel
import android.app.NotificationManager
import android.content.Context
fun createChannel(context: Context) {
val channel = NotificationChannel(
"messages",
"Messages",
NotificationManager.IMPORTANCE_HIGH
)
val manager = context.getSystemService(NotificationManager::class.java)
manager.createNotificationChannel(channel)
}Показ уведомления
Создайте уведомление с помощью NotificationCompat.Builder, связав его с идентификатором канала, а затем отправьте через NotificationManagerCompat.
Помните: в API 33 и новее уведомление появится только после предоставления пользователем разрешения POST_NOTIFICATIONS.
import android.content.Context
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat
fun showNotification(context: Context, title: String, body: String) {
val notification = NotificationCompat.Builder(context, "messages")
.setSmallIcon(android.R.drawable.ic_dialog_info)
.setContentTitle(title)
.setContentText(body)
.setAutoCancel(true)
.build()
NotificationManagerCompat.from(context).notify(1, notification)
}Подписки на темы
Вместо отслеживания отдельных токенов можно отправлять сообщения сразу в тему. Клиенты подписываются на имя темы, а ваш сервер отправляет одно сообщение всем подписанным пользователям.
Это удобно для таких объявлений, как news, sports или all-users.
import com.google.firebase.Firebase
import com.google.firebase.messaging.messaging
import kotlinx.coroutines.tasks.await
suspend fun subscribeToNews() {
Firebase.messaging.subscribeToTopic("news").await()
}
suspend fun unsubscribeFromNews() {
Firebase.messaging.unsubscribeFromTopic("news").await()
}Быстрая проверка
Ваше приложение работает в фоновом режиме и получает от FCM обычное уведомление. Что произойдёт?
Итоги: Cloud Messaging
Теперь вы умеете связываться с пользователями с помощью push-уведомлений:
- Добавляйте
firebase-messagingи запрашивайте POST_NOTIFICATIONS в API 33 и новее. - Каждая установка получает токен FCM; загружайте его на свой сервер.
- Расширяйте
FirebaseMessagingServiceи переопределяйтеonMessageReceived/onNewToken. - Различайте сообщения уведомлений и сообщения с данными.
- Создавайте канал уведомлений, формируйте уведомления с помощью
NotificationCompatили отправляйте сообщения через темы.
На этом завершается знакомство с тремя компонентами Firebase: Auth, Firestore и Messaging — полноценной серверной частью для вашего приложения Android.
Часто задаваемые вопросы
Урок «Отправка уведомлений через Cloud Messaging» бесплатный?
Да — полный текст урока «Отправка уведомлений через Cloud Messaging» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Android Academy, подпишись на CoddyKit PRO. Курс Android Academy содержит 4 уроков всего.
Чему я научусь в уроке «Отправка уведомлений через Cloud Messaging»?
Отправляйте и получайте уведомления FCM Ты практикуешь Android Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Android Academy?
Предыдущий опыт не требуется. Android Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Отправка уведомлений через Cloud Messaging»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Android Academy?
Да. Каждый урок Android Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Настройка Firebase
- Аутентификация Firebase
- Основы Cloud Firestore
- Отправка уведомлений через Cloud Messaging