Открытое приложение для получения уведомлений о пожарной базе (FCM)

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

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

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

Ответ 1

Быстрый ответ:

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

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

ПРЕДУПРЕЖДЕНИЕ: запуск пользовательского интерфейса без какого-либо взаимодействия с пользователем - очень плохая практика для большинства приложений! Пожалуйста, прочитайте ответ MarkG здесь: Как начать работу с помощью службы?

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

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

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

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

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

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

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

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

Ответ 2

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

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

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

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

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

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

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

Ответ 3

Я кратко излагаю шаги здесь, надеюсь, это полезно

ШАГ 1

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

ШАГ 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, вы обнаружите, что 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 > Панель настроек > вкладка Cloud Messaging

YOUR_DEVICE_FCM_TOKEN FirebaseInstanceId.getInstance().getToken() on onTokenRefresh()

ПРИМЕЧАНИЕ

Запуск пользовательского интерфейса без взаимодействия с пользователем - это плохой UX, вам может потребоваться заменить начальную активность службой запуска или что-то в фоновом режиме. Я просто использую активность для целей тестирования, поэтому она будет более визуальной, чем услуга. Спасибо @2ndgab за знакомство с клиентом Google Advanced REST.

Ответ 4

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

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

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