← Назад к вопросам

Как реализовать push-уведомления в Android?

1.7 Middle🔥 181 комментариев
#Тестирование

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Реализация Push-уведомлений в Android

Для реализации push-уведомлений в Android требуется комплексный подход, включающий выбор сервиса, настройку клиентской части, работу с сервером и обработку различных сценариев. Вот пошаговое руководство.

Выбор сервиса push-уведомлений

Основные варианты:

  • Firebase Cloud Messaging (FCM) — стандартный и наиболее популярный выбор от Google. Бесплатный, хорошо интегрируется с экосистемой Google.
  • Сторонние сервисы (OneSignal, Pusher, AWS SNS) — предлагают расширенные функции аналитики, шаблонизации и кросс-платформенной поддержки.
  • Собственная реализация (через WebSocket или MQTT) — для максимального контроля, но требует значительных ресурсов для поддержки.

Рекомендуется использовать FCM для большинства проектов из-за простоты интеграции и надежности.

Этапы реализации с использованием FCM

1. Настройка проекта Firebase

  1. Создайте проект в консоли Firebase.
  2. Добавьте приложение Android, указав package name.
  3. Загрузите файл конфигурации google-services.json в папку app/ вашего модуля.
  4. Добавьте зависимость в build.gradle уровня приложения:
// build.gradle (app-level)
apply plugin: 'com.google.gms.google-services'

dependencies {
    implementation platform('com.google.firebase:firebase-bom:33.4.0')
    implementation 'com.google.firebase:firebase-messaging'
}

И в build.gradle уровня проекта:

// build.gradle (project-level)
dependencies {
    classpath 'com.google.gms:google-services:4.4.2'
}

2. Получение токена устройства

Каждое устройство получает уникальный FCM токен, который используется для отправки уведомлений. Основная логика реализуется в сервисе, наследуемом от FirebaseMessagingService.

// MyFirebaseMessagingService.kt
class MyFirebaseMessagingService : FirebaseMessagingService() {

    override fun onNewToken(token: String) {
        // Критически важно: отправить новый токен на ваш сервер
        sendTokenToServer(token)
    }

    override fun onMessageReceived(remoteMessage: RemoteMessage) {
        // Обработка полученного сообщения
        remoteMessage.notification?.let { notification ->
            // Данные для отображения уведомления (title, body)
            showNotification(notification.title, notification.body)
        }

        remoteMessage.data?.let { data ->
            // Полезная нагрузка (payload) для обработки в приложении
            handleDataPayload(data)
        }
    }

    private fun showNotification(title: String?, body: String?) {
        // Создание системного уведомления через NotificationCompat
        // Не забудьте создать канал для Android 8.0+
    }
}

Не забудьте объявить сервис в AndroidManifest.xml:

<service
    android:name=".MyFirebaseMessagingService"
    android:exported="false">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT" />
    </intent-filter>
</service>

3. Обработка уведомлений: фон, передний план и убитое состояние

  • Приложение в фоне/убито: FCM автоматически показывает уведомление в системном лотке, если в payload есть раздел notification. При тапе — запускает приложение.
  • Приложение на переднем плане: срабатывает onMessageReceived(), и разработчик самостоятельно решает, показывать ли уведомление.

Для обработки глубоких ссылок (deep links) используйте click_action в payload или данные в разделе data.

4. Создание каналов уведомлений (для Android 8.0+)

private fun createNotificationChannel() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        val channel = NotificationChannel(
            "general_channel",
            "General Notifications",
            NotificationManager.IMPORTANCE_DEFAULT
        ).apply {
            description = "Channel for general app notifications"
        }
        val manager = getSystemService(NotificationManager::class.java)
        manager.createNotificationChannel(channel)
    }
}

Отправка уведомлений с сервера

Для отправки используйте HTTP-запрос к FCM API. Пример для Node.js:

// Пример отправки через Firebase Admin SDK
const admin = require('firebase-admin');
admin.initializeApp();

const message = {
    token: 'DEVICE_FCM_TOKEN', // или topic: '/topics/news'
    notification: {
        title: 'Новое сообщение',
        body: 'Вам пришло новое уведомление'
    },
    data: {
        screen: 'chat',
        userId: '12345'
    },
    android: {
        priority: 'high' // Важно для фоновых уведомлений
    }
};

admin.messaging().send(message);

Оптимизация и особенности

  1. Токен обновляется при переустановке приложения, сбросе данных, поэтому в onNewToken() всегда отправляйте его на свой бэкенд.
  2. Приоритеты: используйте priority: "high" для мгновенной доставки важных уведомлений.
  3. Фоновые ограничения: начиная с Android 10+, введены ограничения на фоновую работу. FCM использует высокоприоритетные сервисы Google Play для обхода этих ограничений.
  4. Тестирование: используйте Cloud Messaging Diagnostics в Firebase Console для проверки доставки уведомлений.

Альтернативные подходы

Если FCM недоступен (например, в Китае), можно использовать:

  • Huawei Push Kit для устройств Huawei
  • Собственный WebSocket с Foreground Service для постоянного соединения
  • Систему периодических запросов (polling), но это значительно расходует заряд батареи

Заключение

Реализация push-уведомлений через FCM является наиболее эффективным и рекомендуемым подходом для Android. Ключевые моменты: правильная обработка обновления токена, создание каналов уведомлений для современных версий Android и корректная обработки различных состояний приложения (foreground/background). Для сложных сценариев (чат, онлайн-игры) можно комбинировать FCM с постоянным соединением через WebSocket для мгновенной доставки сообщений. Всегда тестируйте доставку уведомлений на реальных устройствах в разных условиях сети.