Руководство по отправке push-уведомлений на устройства Android с помощью Firebase SDK версии 0.6Tutorial: Send push notifications to Android devices using Firebase SDK version 0.6

В этом руководстве показано, как использовать Центры уведомлений Azure и Firebase Cloud Messaging (FCM) SDK версии 0.6 для отправки push-уведомлений в приложение на платформе Android.This tutorial shows you how to use Azure Notification Hubs and the Firebase Cloud Messaging (FCM) SDK version 0.6 to send push notifications to an Android application. Следуя инструкциям этого руководства, вы создадите пустое приложение Android, которое получает push-уведомления с помощью Firebase Cloud Messaging.In this tutorial, you create a blank Android app that receives push notifications by using Firebase Cloud Messaging (FCM).

Полный код для этого руководства можно скачать на сайте GitHub.The completed code for this tutorial can be downloaded from GitHub.

При работе с этим руководством вы выполните следующие задачи:In this tutorial, you take the following steps:

  • Создание проекта Android Studio.Create an Android Studio project.
  • Создание проекта Firebase с поддержкой Firebase Cloud Messaging.Create a Firebase project that supports Firebase Cloud Messaging.
  • Создание концентратора.Create a hub.
  • Подключение своего приложения к концентратору.Connect your app to the hub.
  • Тестирование приложения.Test the app.

Предварительные требованияPrerequisites

Для работы с этим учебником необходима активная учетная запись Azure.To complete this tutorial, you must have an active Azure account. Если ее нет, можно создать бесплатную пробную учетную запись всего за несколько минут.If you don't have an account, you can create a free trial account in just a couple of minutes. Дополнительные сведения см. в разделе Бесплатная пробная версия Azure.For details, see Azure Free Trial.

Вам также понадобятся следующее.You also need the following items:

  • Последняя версия Android Studio.The latest version of Android Studio
  • Android версии 2.3 или более поздней.Android 2.3 or higher for Firebase Cloud Messaging
  • Репозиторий Google версии 27 или более поздней.Google Repository revision 27 or higher for Firebase Cloud Messaging
  • Службы Google Play версии 9.0.2 или более поздней.Google Play Services 9.0.2 or higher for Firebase Cloud Messaging

Завершение изучения этого учебника является необходимым условием для работы со всеми другими учебниками, посвященными Центрам уведомлений для приложений Android.Completing this tutorial is a prerequisite for doing all other Notification Hubs tutorials for Android apps.

Создание проекта Android StudioCreate an Android Studio Project

  1. Запустите Android Studio.Launch Android Studio.
  2. В меню выберите File (Файл), New (Создать), а затем — New Project (Создать проект).Select File , point to New , and then select New Project.
  3. На странице Choose your project (Выбор проекта) выберите Empty Activity (Пустое действие) и щелкните Далее.On the Choose your project page, select Empty Activity , and then select Next.
  4. На странице Configure your project (Настройка проекта) выполните следующие действия.On the Configure your project page, take the following steps:
    1. Введите имя приложения.Enter a name for the application.

    2. Укажите расположение для сохранения файлов проекта.Specify a location in which to save the project files.

    3. Нажмите кнопку Готово.Select Finish.

      Настройка проекта

Создание проекта Firebase с поддержкой FCMCreate a Firebase project that supports FCM

  1. Войдите в консоль Firebase.Sign in to the Firebase console. Создайте проект Firebase, если его еще нет.Create a new Firebase project if you don't already have one.

  2. После создания проекта выберите Add Firebase to your Android app (Добавить Firebase в приложение Android).After you create your project, select Add Firebase to your Android app.

    Добавление Firebase в приложение Android

  3. Выполните следующие действия на странице Add Firebase to your Android app (Добавление Firebase в приложение Android):On the Add Firebase to your Android app page, take the following steps:

    1. Для параметра Android package name (Имя пакета Android) скопируйте свое значение applicationId в файл приложения build.gradle.For Android package name, copy the value of your applicationId in your application's build.gradle file. В нашем примере он выглядит следующим образом: com.fabrikam.fcmtutorial1app.In this example, it's com.fabrikam.fcmtutorial1app.

      Указание имени пакета.

    2. Выберите Регистрация приложения.Select Register app.

  4. Выберите Download google-services.json (Загрузить google-services.json), сохраните файл в папку приложения проекта, а затем выберите Далее.Select Download google-services.json, save the file into the app folder of your project, and then select Next.

    Загрузка файла google-services.json.

  5. Внесите следующие изменения конфигурации в проект в Android Studio.Make the following configuration changes to your project in Android Studio.

    1. В файл build.gradle уровня проекта (<project>/build.gradle) добавьте в раздел dependencies следующий текст.In your project-level build.gradle file (<project>/build.gradle), add the following statement to the dependencies section.

      classpath 'com.google.gms:google-services:4.0.1'
      
    2. В файле build.gradle уровня приложения (<projectapp>/<-module>/build.gradle) добавьте в раздел dependencies следующий текст.In your app-level build.gradle file (<project>/<app-module>/build.gradle), add the following statements to the dependencies section.

      implementation 'com.google.firebase:firebase-core:16.0.8'
      implementation 'com.google.firebase:firebase-messaging:17.3.4'
      
    3. Добавьте следующую строку в конец файла build.gradle уровня приложения после раздела с зависимостями.Add the following line to the end of the app-level build.gradle file after the dependencies section.

      apply plugin: 'com.google.gms.google-services'
      
    4. На панели инструментов щелкните Синхронизировать сейчас.Select Sync now on the toolbar.

      Изменения конфигурации build.gradle.

  6. Выберите Далее.Select Next.

  7. Выберите Пропустить этот шаг.Select Skip this step.

    Пропуск последнего шага.

  8. В консоли Firebase щелкните значок шестеренки возле имени проекта.In the Firebase console, select the cog for your project. Выберите пункт Project Settings (Параметры проекта).Then select Project Settings.

    Выбор параметров проекта

  9. Если вы еще не скачали файл google-services.json в папку app проекта Android Studio, это можно сделать на этой странице.If you haven't downloaded the google-services.json file into the app folder of your Android Studio project, you can do so on this page.

  10. Переключитесь на вкладку Обмен сообщениями в облаке в верхней части.Switch to the Cloud Messaging tab at the top.

  11. Скопируйте и сохраните Ключ сервера для последующего использования.Copy and save the Server key for later use. Это значение используется для настройки имени центра.You use this value to configure your hub.

Настройка концентратораConfigure a hub

  1. Войдите на портал Azure.Sign in to the Azure portal.

  2. Выберите Все службы в меню слева и щелкните Центры уведомлений в разделе Мобильный.Select All services on the left menu, and then select Notification Hubs in the Mobile section. Щелкните значок звездочки рядом с именем службы, чтобы добавить ее в раздел Избранное в меню слева.Select the star icon next to the service name to add the service to the FAVORITES section on the left menu. После добавления Центров уведомлений в Избранное выберите их в меню слева.After you add Notification Hubs to FAVORITES, select it on the left menu.

    Портал Azure. Выбор Центров уведомлений

  3. На странице Центры уведомлений выберите Добавить на панели инструментов.On the Notification Hubs page, select Add on the toolbar.

    Центры уведомлений. Добавление кнопки панели инструментов

  4. На странице Концентратор уведомлений выполните следующие действия:On the Notification Hub page, do the following steps:

    1. Введите имя в поле Центр уведомлений.Enter a name in Notification Hub.

    2. Введите имя в поле Создать пространство имен.Enter a name in Create a new namespace. Пространство имен содержит один или несколько центров.A namespace contains one or more hubs.

    3. Выберите значение в раскрывающемся списке Расположение.Select a value from the Location drop-down list box. Это значение определяет расположение, в котором создается центр.This value specifies the location in which you want to create the hub.

    4. В поле Группа ресурсов выберите существующую группу ресурсов или укажите имя для новой группы ресурсов.Select an existing resource group in Resource Group, or create a name for a new resource group.

    5. Нажмите кнопку Создать.Select Create.

      Портал Azure: настройка свойств концентратора уведомлений

  5. Последовательно выберите Уведомления (значок колокольчика) и Перейти к ресурсу.Select Notifications (the bell icon), and then select Go to resource. Вы также можете обновить список на странице Центры уведомлений и выбрать свой центр.You can also refresh the list on the Notification Hubs page and select your hub.

    Портал Azure: кнопка "Перейти к ресурсу"

  6. Выберите Политики доступа в списке.Select Access Policies from the list. Обратите внимание, что станут доступны две строки подключения.Note that the two connection strings are available to you. Они потребуются позже для обработки push-уведомлений.You'll need them later to handle push notifications.

    Важно!

    Не используйте в приложении политику DefaultFullSharedAccessSignature.Do not use the DefaultFullSharedAccessSignature policy in your application. Этот параметр можно использовать только в серверной части.This is meant to be used in your back end only.

    Портал Azure: строки подключения к концентратору уведомлений

Настройка параметров Firebase Cloud Messaging для центраConfigure Firebase Cloud Messaging settings for the hub

  1. На панели слева в разделе Параметры , выберите Google (GCM/FCM) .In the left pane, under Settings, select Google (GCM/FCM).

  2. Введите ключ сервера для проекта FCM, сохраненного ранее.Enter the server key for the FCM project that you saved earlier.

  3. На панели инструментов нажмите кнопку Сохранить.On the toolbar, select Save.

    Центры уведомлений Azure в Google (FCM)

  4. Портал Azure отображает предупреждения о том, что концентратор был успешно обновлен.The Azure portal displays a message in alerts that the hub has been successfully updated. Кнопка Сохранить отключена.The Save button is disabled.

Теперь ваша служба настроена для работы с Firebase Cloud Messaging.Your hub is now configured to work with Firebase Cloud Messaging. У вас также есть строки подключения, которые необходимы для отправки уведомлений на устройство и регистрации приложения для получения уведомлений.You also have the connection strings that are necessary to send notifications to a device and register an app to receive notifications.

Подключение приложения к центру уведомленийConnect your app to the notification hub

Добавление служб Google Play в проектAdd Google Play services to the project

  1. В Android Studio в меню выберите Средства , а затем — Диспетчер пакетов SDK.In Android Studio, select Tools on the menu, and then select SDK Manager.

  2. Выберите целевую версию пакета SDK для Android, который используется в проекте.Select the target version of the Android SDK that is used in your project. Затем выберите Show Package Details (Показать сведения о пакете).Then select Show Package Details.

    Диспетчер пакетов SDK Android: выбор целевой версии

  3. Выберите Google APIs (API-интерфейсы Google), если они еще не установлены.Select Google APIs , if it's not already installed.

    Диспетчер пакетов SDK для Android с выбранными API-интерфейсами Google

  4. Переключитесь на вкладку SDK Tools. Если сервисы Google Play еще не установлены, щелкните Сервисы Google Play , как показано на рисунке ниже.Switch to the SDK Tools tab. If you haven't already installed Google Play Services, select Google Play Services as shown in the following image. Затем выберите Применить для установки.Then select Apply to install. Запишите путь к пакету SDK. Он вам потребуется в дальнейшем.Note the SDK path, for use in a later step.

    Диспетчер пакетов SDK для Android с выбранными Сервисами Google Play

  5. Если вы видите диалоговое окно Подтвердить изменение , выберите ОК.If you see the Confirm Change dialog box, select OK. Установщик компонентов устанавливает запрошенные компоненты.The Component Installer installs the requested components. После установки компонентов выберите Готово.Select Finish after the components are installed.

  6. Выберите ОК , чтобы закрыть диалоговое окно Settings for New Projects (Параметры для новых проектов).Select OK to close the Settings for New Projects dialog box.

  7. Откройте файл AndroidManifest.xml, а затем добавьте следующий тег для тега приложения.Open the AndroidManifest.xml file, and then add the following tag to the application tag.

    <meta-data android:name="com.google.android.gms.version"
         android:value="@integer/google_play_services_version" />
    

Затем добавьте библиотеки Центров уведомлений Azure.Add Azure Notification Hubs libraries

  1. В файле Build.Gradle для приложений добавьте следующие строки в раздел dependencies.In the Build.Gradle file for the app, add the following lines in the dependencies section.

    implementation 'com.microsoft.azure:notification-hubs-android-sdk:0.6@aar'
    
  2. После раздела dependencies добавьте следующий репозиторий.Add the following repository after the dependencies section.

    repositories {
        maven {
            url "https://dl.bintray.com/microsoftazuremobile/SDK"
        }
    }
    

Добавление поддержки Google FirebaseAdd Google Firebase support

  1. В файле Build.Gradle для приложения добавьте следующие строки в раздел dependencies , если они еще не существуют.In the Build.Gradle file for the app, add the following lines in the dependencies section if they don't already exist.

    implementation 'com.google.firebase:firebase-core:16.0.8'
    implementation 'com.google.firebase:firebase-messaging:17.3.4'
    
  2. Добавьте следующий подключаемый модуль в конце файла, если он еще не выбран.Add the following plug-in at the end of the file if it's not already there.

    apply plugin: 'com.google.gms.google-services'
    
  3. На панели инструментов щелкните Синхронизировать сейчас.Select Sync Now on the toolbar.

Обновите файл AndroidManifest.xmlUpdate the AndroidManifest.xml file

  1. После получения маркера регистрации в FCM используйте его для регистрации в Центрах уведомлений Azure.After you receive your FCM registration token, you use it to register with Azure Notification Hubs. Регистрация в фоновом режиме выполняется с помощью службы IntentService с именем RegistrationIntentService.You support this registration in the background by using an IntentService named RegistrationIntentService. Эта служба также обновит ваш маркер регистрации FCM.This service also refreshes your FCM registration token. Также создается класс с именем FirebaseService в качестве подкласса FirebaseMessagingService и переопределяется метод onMessageReceived для получения и обработки уведомлений.You also create a class named FirebaseService as a subclass of FirebaseMessagingService and override the onMessageReceived method to receive and handle notifications.

    Добавьте приведенное ниже определение службы внутри тега <application> в файле AndroidManifest.xml.Add the following service definition to the AndroidManifest.xml file, inside the <application> tag.

    <service
        android:name=".RegistrationIntentService"
        android:exported="false">
    </service>
    <service
        android:name=".FirebaseService"
        android:exported="false">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
    </service>
    
  2. Добавьте следующие разрешения, связанные с FCM, под тегом </application>.Add the following necessary FCM-related permissions below the </application> tag.

    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.GET_ACCOUNTS"/>
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    

Добавление кодаAdd code

  1. В представлении проекта разверните узел app > src > main > java.In the Project View, expand app > src > main > java. Щелкните правой кнопкой мыши папку своего пакета в разделе java , выберите New (Создать), а затем выберите класс Java.Right-click your package folder under java , select New , and then select Java Class. Укажите NotificationSettings для имени, а затем нажмите кнопку ОК.Enter NotificationSettings for the name, and then select OK.

    Обязательно обновите эти три заполнителя в следующем коде для класса NotificationSettings:Make sure to update these three placeholders in the following code for the NotificationSettings class:

    • HubListenConnectionString  — укажите для центра строку подключения DefaultListenAccessSignature.HubListenConnectionString : The DefaultListenAccessSignature connection string for your hub. Чтобы скопировать эту строку подключения, щелкните пункт Политики доступа в своем центре на Портал Azure.You can copy that connection string by clicking Access Policies in your hub in the Azure portal.

    • HubName : Используйте имя своего концентратора, которое отображается на странице концентратора на Портал Azure.HubName : Use the name of your hub that appears in the hub page in the Azure portal.

      NotificationSettings :NotificationSettings code:

      public class NotificationSettings {
          public static String HubName = "<Your HubName>";
          public static String HubListenConnectionString = "<Enter your DefaultListenSharedAccessSignature connection string>";
      }
      

      Важно!

      Прежде чем продолжить, введите имя и DefaultListenSharedAccessSignature вашего концентратора.Enter the name and the DefaultListenSharedAccessSignature of your hub before proceeding further.

  2. Добавьте еще один новый класс в проект RegistrationIntentService.Add another new class to your project named RegistrationIntentService. Этот класс реализует интерфейс IntentService.This class implements the IntentService interface. Он также выполняет обновление маркера FCM и регистрацию в центре уведомлений.It also handles refreshing the FCM token and registering with the notification hub.

    Используйте для этого класса следующий код:Use the following code for this class.

    import android.app.IntentService;
    import android.content.Intent;
    import android.content.SharedPreferences;
    import android.preference.PreferenceManager;
    import android.util.Log;
    import com.google.android.gms.tasks.OnSuccessListener;
    import com.google.firebase.iid.FirebaseInstanceId;
    import com.google.firebase.iid.InstanceIdResult;
    import com.microsoft.windowsazure.messaging.NotificationHub;
    import java.util.concurrent.TimeUnit;
    
    public class RegistrationIntentService extends IntentService {
    
        private static final String TAG = "RegIntentService";
        String FCM_token = null;
    
        private NotificationHub hub;
    
        public RegistrationIntentService() {
            super(TAG);
        }
    
        @Override
        protected void onHandleIntent(Intent intent) {
    
            SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
            String resultString = null;
            String regID = null;
            String storedToken = null;
    
            try {
                FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(new OnSuccessListener<InstanceIdResult>() { 
                    @Override 
                    public void onSuccess(InstanceIdResult instanceIdResult) { 
                        FCM_token = instanceIdResult.getToken(); 
                        Log.d(TAG, "FCM Registration Token: " + FCM_token); 
                    } 
                }); 
                TimeUnit.SECONDS.sleep(1);
    
                // Storing the registration ID that indicates whether the generated token has been
                // sent to your server. If it is not stored, send the token to your server.
                // Otherwise, your server should have already received the token.
                if (((regID=sharedPreferences.getString("registrationID", null)) == null)){
    
                    NotificationHub hub = new NotificationHub(NotificationSettings.HubName,
                            NotificationSettings.HubListenConnectionString, this);
                    Log.d(TAG, "Attempting a new registration with NH using FCM token : " + FCM_token);
                    regID = hub.register(FCM_token).getRegistrationId();
    
                    // If you want to use tags...
                    // Refer to : https://azure.microsoft.com/documentation/articles/notification-hubs-routing-tag-expressions/
                    // regID = hub.register(token, "tag1,tag2").getRegistrationId();
    
                    resultString = "New NH Registration Successfully - RegId : " + regID;
                    Log.d(TAG, resultString);
    
                    sharedPreferences.edit().putString("registrationID", regID ).apply();
                    sharedPreferences.edit().putString("FCMtoken", FCM_token ).apply();
                }
    
                // Check to see if the token has been compromised and needs refreshing.
               else if (!(storedToken = sharedPreferences.getString("FCMtoken", "")).equals(FCM_token)) {
    
                    NotificationHub hub = new NotificationHub(NotificationSettings.HubName,
                            NotificationSettings.HubListenConnectionString, this);
                    Log.d(TAG, "NH Registration refreshing with token : " + FCM_token);
                    regID = hub.register(FCM_token).getRegistrationId();
    
                    // If you want to use tags...
                    // Refer to : https://azure.microsoft.com/documentation/articles/notification-hubs-routing-tag-expressions/
                    // regID = hub.register(token, "tag1,tag2").getRegistrationId();
    
                    resultString = "New NH Registration Successfully - RegId : " + regID;
                    Log.d(TAG, resultString);
    
                    sharedPreferences.edit().putString("registrationID", regID ).apply();
                    sharedPreferences.edit().putString("FCMtoken", FCM_token ).apply();
                }
    
                else {
                    resultString = "Previously Registered Successfully - RegId : " + regID;
                }
            } catch (Exception e) {
                Log.e(TAG, resultString="Failed to complete registration", e);
                // If an exception happens while fetching the new token or updating registration data
                // on a third-party server, this ensures that we'll attempt the update at a later time.
            }
    
            // Notify UI that registration has completed.
            if (MainActivity.isVisible) {
                MainActivity.mainActivity.ToastNotify(resultString);
            }
        }
    }
    
  3. В классе MainActivity добавьте следующие операторы import выше объявления класса.In the MainActivity class, add the following import statements above the class declaration.

    import com.google.android.gms.common.ConnectionResult;
    import com.google.android.gms.common.GoogleApiAvailability;
    import android.content.Intent;
    import android.util.Log;
    import android.widget.TextView;
    import android.widget.Toast;
    
  4. Добавьте следующие элементы в верхней части класса.Add the following members at the top of the class. Используйте эти поля для проверки доступности служб Google Play в соответствии с рекомендациями Google.You use these fields to check the availability of Google Play Services as recommended by Google.

    public static MainActivity mainActivity;
    public static Boolean isVisible = false;
    private static final String TAG = "MainActivity";
    private static final int PLAY_SERVICES_RESOLUTION_REQUEST = 9000;
    
  5. В классе MainActivity добавьте следующий метод проверки доступности сервисов Google Play.In the MainActivity class, add the following method to check the availability of Google Play Services.

    /**
    * Check the device to make sure it has the Google Play Services APK. If
    * it doesn't, display a dialog box that enables  users to download the APK from
    * the Google Play Store or enable it in the device's system settings.
    */
    
    private boolean checkPlayServices() {
        GoogleApiAvailability apiAvailability = GoogleApiAvailability.getInstance();
        int resultCode = apiAvailability.isGooglePlayServicesAvailable(this);
        if (resultCode != ConnectionResult.SUCCESS) {
            if (apiAvailability.isUserResolvableError(resultCode)) {
                apiAvailability.getErrorDialog(this, resultCode, PLAY_SERVICES_RESOLUTION_REQUEST)
                        .show();
            } else {
                Log.i(TAG, "This device is not supported by Google Play Services.");
                ToastNotify("This device is not supported by Google Play Services.");
                finish();
            }
            return false;
        }
        return true;
    }
    
  6. В классе MainActivity добавьте следующий код, который проверяет сервисы Google Play, прежде чем вызывать IntentService. Таким образом вы получите маркер регистрации в FCM и выполните регистрацию в своем центре.In the MainActivity class, add the following code that checks for Google Play Services before calling the IntentService to get your FCM registration token and register with your hub:

    public void registerWithNotificationHubs()
    {
        if (checkPlayServices()) {
            // Start IntentService to register this application with FCM.
            Intent intent = new Intent(this, RegistrationIntentService.class);
            startService(intent);
        }
    }
    
  7. В методе OnCreate класса MainActivity добавьте следующий код, чтобы начать регистрацию при создании действия.In the OnCreate method of the MainActivity class, add the following code to start the registration process when the activity is created:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        mainActivity = this;
        registerWithNotificationHubs();
        FirebaseService.createChannelAndHandleNotifications(getApplicationContext());
    }
    
  8. Добавьте эти дополнительные методы в класс MainActivity, чтобы проверять состояние приложения и отображать в нем полученные данные.To verify app state and report status in your app, add these additional methods to MainActivity:

    @Override
    protected void onStart() {
        super.onStart();
        isVisible = true;
    }
    
    @Override
    protected void onPause() {
        super.onPause();
        isVisible = false;
    }
    
    @Override
    protected void onResume() {
        super.onResume();
        isVisible = true;
    }
    
    @Override
    protected void onStop() {
        super.onStop();
        isVisible = false;
    }
    
    public void ToastNotify(final String notificationMessage) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(MainActivity.this, notificationMessage, Toast.LENGTH_LONG).show();
                TextView helloText = (TextView) findViewById(R.id.text_hello);
                helloText.setText(notificationMessage);
            }
        });
    }
    
  9. Метод ToastNotify использует элемент управления TextView Hello World , чтобы постоянно передавать в приложение сведения о состоянии и уведомления.The ToastNotify method uses the "Hello World" TextView control to report status and notifications persistently in the app. В файле макета res > layout > activity_main.xml добавьте следующий идентификатор для этого элемента управления.In your res > layout > activity_main.xml layout, add the following ID for that control.

    android:id="@+id/text_hello"
    

    Снимок экрана: идентификатор android:id="@+id/text_hello", примененный к элементу управления TextView.

  10. Затем добавьте подкласс для получателя, определенного в AndroidManifest.xml.Next you add a subclass for the receiver that you defined in AndroidManifest.xml. Добавьте еще один новый класс в проект FirebaseService.Add another new class to your project named FirebaseService.

  11. Добавьте в начало файла FirebaseService.java следующие операторы импорта:Add the following import statements at the top of FirebaseService.java:

    import com.google.firebase.messaging.FirebaseMessagingService;
    import com.google.firebase.messaging.RemoteMessage;
    import android.util.Log;
    import android.app.NotificationChannel;
    import android.app.NotificationManager;
    import android.app.PendingIntent;
    import android.content.Context;
    import android.content.Intent;
    import android.media.RingtoneManager;
    import android.net.Uri;
    import android.os.Build;
    import android.os.Bundle;
    import androidx.core.app.NotificationCompat;
    
  12. Добавьте в класс FirebaseService следующий код, чтобы сделать его подклассом класса FirebaseMessagingService.Add the following code for the FirebaseService class, making it a subclass of FirebaseMessagingService.

    Этот код переопределяет метод onMessageReceived и сообщает о полученных уведомлениях.This code overrides the onMessageReceived method and reports notifications that are received. Кроме того, он отправляет push-уведомление в диспетчер уведомлений Android с помощью метода sendNotification().it also sends the push notification to the Android notification manager by using the sendNotification() method. Вызовите метод sendNotification(), если получено уведомление, а приложение не запущено.Call the sendNotification() method when the app isn't running and a notification is received.

    public class FirebaseService extends FirebaseMessagingService
    {
        private String TAG = "FirebaseService";
    
        public static final String NOTIFICATION_CHANNEL_ID = "nh-demo-channel-id";
        public static final String NOTIFICATION_CHANNEL_NAME = "Notification Hubs Demo Channel";
        public static final String NOTIFICATION_CHANNEL_DESCRIPTION = "Notification Hubs Demo Channel";
    
        public static final int NOTIFICATION_ID = 1;
        private NotificationManager mNotificationManager;
        NotificationCompat.Builder builder;
        static Context ctx;
    
        @Override
        public void onMessageReceived(RemoteMessage remoteMessage) {
            // ...
    
            // TODO(developer): Handle FCM messages here.
            // Not getting messages here? See why this may be: https://goo.gl/39bRNJ
            Log.d(TAG, "From: " + remoteMessage.getFrom());
    
            String nhMessage;
            // Check if message contains a notification payload.
            if (remoteMessage.getNotification() != null) {
                Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
    
                nhMessage = remoteMessage.getNotification().getBody();
            }
            else {
                nhMessage = remoteMessage.getData().values().iterator().next();
            }
    
            // Also if you intend on generating your own notifications as a result of a received FCM
            // message, here is where that should be initiated. See sendNotification method below.
            if (MainActivity.isVisible) {
                MainActivity.mainActivity.ToastNotify(nhMessage);
            }
            sendNotification(nhMessage);
        }
    
        private void sendNotification(String msg) {
    
            Intent intent = new Intent(ctx, MainActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    
            mNotificationManager = (NotificationManager)
                    ctx.getSystemService(Context.NOTIFICATION_SERVICE);
    
            PendingIntent contentIntent = PendingIntent.getActivity(ctx, 0,
                    intent, PendingIntent.FLAG_ONE_SHOT);
    
            Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
            NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(
                    ctx,
                    NOTIFICATION_CHANNEL_ID)
                    .setContentText(msg)
                    .setPriority(NotificationCompat.PRIORITY_HIGH)
                    .setSmallIcon(android.R.drawable.ic_popup_reminder)
                    .setBadgeIconType(NotificationCompat.BADGE_ICON_SMALL);
    
            notificationBuilder.setContentIntent(contentIntent);
            mNotificationManager.notify(NOTIFICATION_ID, notificationBuilder.build());
        }
    
        public static void createChannelAndHandleNotifications(Context context) {
            ctx = context;
    
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                NotificationChannel channel = new NotificationChannel(
                        NOTIFICATION_CHANNEL_ID,
                        NOTIFICATION_CHANNEL_NAME,
                        NotificationManager.IMPORTANCE_HIGH);
                channel.setDescription(NOTIFICATION_CHANNEL_DESCRIPTION);
                channel.setShowBadge(true);
    
                NotificationManager notificationManager = context.getSystemService(NotificationManager.class);
                notificationManager.createNotificationChannel(channel);
             }
        }
    }
    
  13. В Android Studio в строке меню выберите Build > Rebuild Project (Сборка > Пересобрать проект) чтобы убедиться, что в вашем коде нет ошибок.In Android Studio, on the menu bar, select Build > Rebuild Project to make sure that there aren't any errors in your code. Если появляется сообщение об ошибке о значке ic_launcher, удалите следующую инструкцию из файла AndroidManifest.xml.If you receive an error about the ic_launcher icon, remove the following statement from the AndroidManifest.xml file:

        android:icon="@mipmap/ic_launcher"
    
  14. Убедитесь, что у вас есть виртуальное устройство для запуска приложения.Ensure you have a virtual device for running the app. Если его нет, добавьте его следующим образом:If you do not have one, add one as follows:

    1. Запуск диспетчера устройств
    2. Создание виртуального устройства
  15. Запустите приложение на выбранном устройстве и убедитесь, что оно успешно зарегистрировано в концентраторе.Run the app on your selected device and verify that it registers successfully with the hub.

    Примечание

    Во время первоначального запуска регистрация может завершиться неудачно, пока не будет вызван метод onTokenRefresh() службы ИД экземпляра.Registration might fail during the initial launch until the onTokenRefresh() method of the instance ID service is called. Чтобы заново начать регистрацию в центре уведомлений, обновите страницу.The refresh should initiate a successful registration with the notification hub.

    Устройство успешно зарегистрировано

Проверка отправки уведомления из центра уведомленийTest send notification from the notification hub

Push-уведомления с Портал Azure можно отправить, выполнив следующие действия.You can send push notifications from the Azure portal by taking the following steps:

  1. На портале Azure на странице "Цента уведомлений" для своего центра выберите Тестовая отправка в разделе Устранение неполадок.In the Azure portal, on the Notification Hub page for your hub, select Test Send in the Troubleshooting section.

  2. В качестве платформы выберите Android.For Platforms , select Android.

  3. Нажмите кнопку Отправить.Select Send. Вы пока не увидите уведомление на устройстве Android, потому что на нем еще не запущено мобильное приложение.You won't see a notification on the Android device yet because you haven't run the mobile app on it. После запуска мобильного приложения нажмите еще раз кнопку Send (Отправить), чтобы просмотреть уведомление.After you run the mobile app, select the Send button again to see the notification message.

  4. Результат операции можно увидеть в списке внизу.See the result of the operation in the list at the bottom.

    Центры уведомлений Azure — тестовая отправка

  5. Вы увидите сообщение уведомления на своем устройстве.You see the notification message on your device.

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

Push-уведомления обычно отправляются во внутренней службе, например мобильных приложениях или службе ASP.NET, с помощью совместимой библиотеки.Push notifications are normally sent in a back-end service like Mobile Apps or ASP.NET using a compatible library. Если для серверной части библиотека недоступна, для отправки уведомлений также можно напрямую использовать REST API.If a library isn't available for your back end, you can also use the REST API directly to send notification messages.

Ниже приведен список других учебников, касающихся отправки уведомлений:Here is a list of some other tutorials you might want to review for sending notifications:

Запуск мобильного приложения в эмулятореRun the mobile app on emulator

Перед проверкой отправки push-уведомлений в эмуляторе, убедитесь, что образ эмулятора поддерживает уровень API Google, выбранный для приложения.Before you test push notifications inside an emulator, make sure that your emulator image supports the Google API level that you chose for your app. Если образ не поддерживает собственные API-интерфейсы Google, создается исключение SERVICE_NOT_AVAILABLE.If your image doesn't support native Google APIs, you might get the SERVICE_NOT_AVAILABLE exception.

Кроме того, добавьте учетную запись Google в запущенный эмулятор. Для этого щелкните Settings (Параметры) > Accounts (Учетные записи).Also make sure that you've added your Google account to your running emulator under Settings > Accounts. В противном случае попытки регистрации в FCM могут привести к исключению AUTHENTICATION_FAILED.Otherwise, your attempts to register with FCM might result in the AUTHENTICATION_FAILED exception.

Дальнейшие действияNext steps

В этом руководстве вы использовали Firebase Cloud Messaging, для отправки уведомлений на все устройства Android, зарегистрированных в службе.In this tutorial, you used Firebase Cloud Messaging to broadcast notifications to all Android devices that were registered with the service. Чтобы узнать, как отправлять push-уведомления на конкретные устройства, перейдите к следующему руководству:To learn how to push notifications to specific devices, advance to the following tutorial: