Статьи

Push-уведомление в Android с помощью облачных сообщений Firebase

В этом посте рассказывается, как отправлять push-уведомления в Android. Раньше нас использовали для отправки push-уведомлений в Android с помощью службы сообщений Google Cloud. Недавно был представлен новый способ отправки push-данных с использованием Firebase. Даже если основные принципы остаются прежними, Firebase представила некоторые интересные новые функции. Firebase поддерживает другие сервисы, такие как:

  • Аутентификация
  • Удаленная настройка
  • Отчет о сбое

В этом посте шаг за шагом будет рассказано, как отправить push-уведомление из консоли Firebase в приложение.

Что такое push-уведомление?

Прежде чем углубляться в детали того, как отправлять уведомления в Android, полезно уточнить, что такое push-уведомление. Используя push-уведомление Android, наше приложение может уведомлять пользователя о новых событиях. Это происходит, даже если наше приложение не работает на переднем плане. Используя этот сервис, мы можем отправлять данные с нашего сервера в наше приложение всякий раз, когда происходит новое событие. Эта парадигма гораздо более эффективна, если вы продолжаете подключаться к серверу (метод pull), чтобы узнать, есть ли новые события.

Используя push-уведомления, мы можем держать пользователя в курсе событий, не разряжая аккумулятор смартфона. Когда пользователь получает уведомление, оно отображается в виде пользовательского значка в строке состояния. При отправке push-уведомления используются разные парадигмы:

Сообщение на одно устройство

Сообщение в теме (отправка одного и того же сообщения на несколько устройств, подписанных на определенную тему. Это реализует модель издатель / подписчики)

Сообщение группе (несколько устройств, использующих один и тот же ключ, который используется для идентификации смартфона)

android_push_notification_firebase-1024x512

Настроить проект облачных сообщений Firebase

Время начинать! Создайте учетную запись для доступа к консоли Firebase и определите проект:

android_firebase_create_new_project

а потом:

android_firebase_project

Как только вы создали свой проект, вы должны добавить имя пакета вашего приложения. Будьте внимательны, используя одно и то же имя пакета в Android Studio и в консоли Firebase:

create_android_firebase_app

В конце этого процесса ваш проект настроен на Firebase, и вы готовы разработать приложение для Android. В конце вы получите файл json, который вам нужно скопировать на уровне модуля приложения.

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

Теперь мы можем разработать приложение для Android, интегрированное с Firebase. В качестве первого шага мы должны добавить Firebase в наше приложение и изменить файлы Gradle. На уровне проекта давайте изменим Gradle Fille как:

1
2
3
4
5
6
7
8
9
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.3'
        classpath 'com.google.gms:google-services:3.0.0'
    }
}

и в имени модуля (обычно с именем app):

1
2
3
4
5
6
7
8
9
....
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:24.2.0'
    compile 'com.google.firebase:firebase-messaging:9.4.0'
}
 
apply plugin: 'com.google.gms.google-services'

В этом случае мы добавили зависимость обмена сообщениями. После настройки файлов Gradle следующим шагом будет создание нашего приложения. В MainActivity мы добавляем кнопку для получения текущего token . Этот токен важен, потому что мы используем его в консоли Firebase, чтобы установить правильное целевое устройство.
Предположим, мы уже определили макет, содержащий кнопку, в классе Activity:

01
02
03
04
05
06
07
08
09
10
11
Button btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
      String tkn = FirebaseInstanceId.getInstance().getToken();
      Toast.makeText(MainActivity.this, "Current token ["+tkn+"]",
                     Toast.LENGTH_LONG).show();
      Log.d("App", "Token ["+tkn+"]");
     }
   });
 }

Обратите внимание, что мы использовали синглтон FirebaseInstanceId, чтобы получить текущий экземпляр, а затем текущий токен. Может потребоваться некоторое время, прежде чем токен будет сгенерирован, поэтому вы можете получить нулевое значение в начале.
Более того, мы можем отслеживать процесс создания токена и получать уведомления, когда он доступен, используя пользовательский сервис, расширяющий FirebaseInstanceIdService . В этом случае мы переопределяем метод onTokenRefresh .

1
2
3
4
5
6
7
8
public class FireIDService extends FirebaseInstanceIdService {
    @Override
    public void onTokenRefresh() {
        String tkn = FirebaseInstanceId.getInstance().getToken();
        Log.d("Not","Token ["+tkn+"]");
 
    }
}

В этом методе мы просто регистрируем токен, но его можно использовать в реальном приложении для отправки токена на сервер, чтобы сервер его сохранял.
Не забудьте объявить этот сервис в Manifest.xml .

1
2
3
4
5
6
7
..
<service
     android:name=".FireIDService">
     <intent-filter>
        <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
     </intent-filter>
 </service>

В конце мы реализуем сервис, который обрабатывает входящие push-уведомления:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class FireMsgService extends FirebaseMessagingService {
 
    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        super.onMessageReceived(remoteMessage);
 
        Log.d("Msg", "Message received ["+remoteMessage+"]");
 
        // Create Notification
        Intent intent = new Intent(this, MainActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 1410,
                        intent, PendingIntent.FLAG_ONE_SHOT);
 
        NotificationCompat.Builder notificationBuilder = new
                 NotificationCompat.Builder(this)
                .setSmallIcon(R.drawable.ic_stat_name)
                .setContentTitle("Message")
                .setContentText(remoteMessage.getNotification().getBody())
                .setAutoCancel(true)
                .setContentIntent(pendingIntent);
    }
}

В методе onMessageReceived мы просто показываем уведомление, содержащее отправленное сообщение.
Запустив приложение, мы получим результат, показанный на видео ниже:

В конце этой статьи вы узнали, как использовать push-уведомления в Android с Firebase.