0Pricing
Android Academy · Урок

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):

  1. При первом запуске приложение регистрируется в FCM и получает токен устройства
  2. Приложение отправляет токен на Ваш сервер
  3. Когда требуется отправить push-уведомление, Ваш сервер отправляет сообщение в FCM
  4. FCM доставляет его на устройство

FCM — бесплатная и надёжная служба, работающая даже после завершения приложения.

Добавление Firebase в проект

Действия для добавления Firebase:

  1. Откройте Firebase Console → Add project → Add Android app
  2. Зарегистрируйте приложение, указав имя пакета
  3. Скачайте google-services.json и поместите его в app/
  4. Добавьте плагины и зависимости
// 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 — локальная установка не требуется.

Все уроки этого курса

  1. Retrofit и REST API
  2. Загрузка изображений с Coil
  3. Обработка ошибок и UX
  4. Push-уведомления
  5. WorkManager и фоновые задачи
  6. Публикация в Play Store
← Назад к Android Academy