Открыть приложение на firebase уведомление получено (FCM)

Я хочу открыть приложение автоматически при получении уведомления, возможно ли это с помощью Firebase и новых уведомлений FCM?

Я знаю, что могу установить click_action, но это только для настройки, какая деятельность начнется при щелчке уведомления, мне нужно что-то, что начнется автоматически при получении уведомления.

Я попробовал быстрый образец обмена сообщениями firebase, и есть метод onMessageReceived (), но он работает только в том случае, если приложение находится в передний план. Есть ли что-то, что будет выполняться, пока приложение находится в фоновом режиме? GCM может сделать что-то вроде того, что я хочу здесь, напрямую запустив намерение активности из широковещательного приемника, который вызывается при получении уведомления.

4 ответов


короткий ответ:

чтобы автоматически открыть приложение через FCM, вам нужно использовать data-message, что гарантирует всегда вызывать FirebaseMessagingService.onMessageReceived() метод.

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

предупреждение: запуск пользовательского интерфейса без какого-либо взаимодействия с пользователем-это очень плохая практика для большинства приложений! Ознакомьтесь, пожалуйста MarkG ответ здесь: как начать деятельность от службы?

[...] Прерывание того, что пользователь в настоящее время делает, считается плохой формой дизайна, особенно от того, что должно работать в фоновом режиме.
Таким образом, вы должны рассмотреть возможность использования уведомления [...] для запуска желаемого действия, когда пользователь решает, что пришло время исследовать. [...]

полное объяснение:

FCM работает аналогично GCM и может получить два типов сообщений:

  1. экран-сообщения:
    нагрузка {"notification" : { "body" : "hello world"}}
    Эти сообщения автоматически отображается, когда приложение находится в фоновом режиме и они называют FirebaseMessagingService.onMessageReceived() если приложение уже находится на переднем плане.

  2. сведения-сообщения:
    грузоподъемностью {"data" : { "key1" : "value1"}}
    Эти сообщения всегда вызывается FirebaseMessagingService.onMessageReceived(),
    даже если приложение закрыто или в фон.

click_action является параметром полезной нагрузки уведомления, поэтому он применяется к отображаемым сообщениям.

указывает действие, связанное с щелчком пользователя на уведомлении.
Если задано действие с соответствующим фильтром намерений запускается когда пользователь щелкает уведомление.

https://firebase.google.com/docs/cloud-messaging/http-server-ref#notification-payload-support


похоже этот раздел руководства является ключом к головоломке backgrounded приложений:

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

уведомления, когда приложение находится в фоновом режиме.
В этом в случае, уведомление доставляется в системный лоток устройства. Ля пользователь нажмите на уведомление открывает приложение запуска по умолчанию.

сообщения с уведомлением и полезные данные.
В этом случае уведомление доставляется в системный лоток устройства, а данные груз доставляется в массовку намерения свой лаунчер Деятельность.

по существу, когда приложение является backgrounded, на данный момент он не реагирует и не работает. Вместо этого сообщение доставляется в системный трей. Однако чуть ниже объясняется решение.

Если вы хотите открыть приложение и выполнить определенное действие [в фоновом режиме], установите click_action в полезной нагрузке уведомления и сопоставить его с намерением отфильтруйте действие, которое вы хотите запустить. Например, набор click_action to OPEN_ACTIVITY_1 для запуска фильтра намерений как следующий:

<intent-filter>
  <action android:name="OPEN_ACTIVITY_1" />
  <category android:name="android.intent.category.DEFAULT" />
</intent-filter>

я суммирую шаги здесь, Надеюсь, это полезно

Шаг 1

после FCM руководство пользователя. Убедитесь, что все работает правильно, нажав сообщение от консоль Firebase.

Шаг 2

измените свой пользовательский класс FirebaseMessagingService следующим образом:

public class MyFirebaseMessagingService extends FirebaseMessagingService {

private static final String TAG = "MyFirebaseMsgService";
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    Log.d(TAG, "From: " + remoteMessage.getFrom());
    startActivity(new Intent(this, SplashActivity.class));
}
}

теперь, используя Firebase console push messages снова, вы обнаружите, что onMessageReceived только пожаров, когда ваше приложение находится на переднем плане. Потому что консоль Firebase может отправлять Notification message только. Для того, чтобы отправить Data message, нам нужен Шаг 3.

Шаг 3

установить Google расширенный клиент REST

входные параметры:

url: https://fcm.googleapis.com/fcm/send
method: POST 
Raw header: 
Content-Type: application/json
Authorization:key=YOUR_SERVER_KEY
Raw payload:
{
   "to" : "YOUR_DEVICE_FCM_TOKEN",
   "data" : {
     "Nick" : "Mario",
     "body" : "great match!",
     "Room" : "PortugalVSDenmark"
   },
 } 

YOUR_SERVER_KEY доступен в консоли Firebase > панель настроек > вкладка облачные сообщения

YOUR_DEVICE_FCM_TOKEN является FirebaseInstanceId.getInstance().getToken() на onTokenRefresh()

Примечание

запуск пользовательского интерфейса без взаимодействия с пользователем-плохой UX, вам может потребоваться заменить start activity на start service или что-то в фоновом режиме. Я просто использую activity для тестирования, поэтому он будет более визуальным, чем сервис. Спасибо @2ndgab для введения в Google Advanced rest client tool.


[Android] Если вы используете уведомления Firebase (не Firebase Cloud Messaging), все, что вам нужно сделать, это включить Firebase Messaging в свою сборку.gradle, а затем свяжите свое приложение с проектом на консоли Firebase.

Если ваше приложение находится в фоновом режиме, любое сообщение, отправленное с консоли, даст вам системное уведомление, которое, если его коснуться, активирует ваше приложение.

Взгляните сюда:https://youtu.be/KpTSpVh9SfY?t=10m22s