Aplicación abierta en la notificación de firebase recibida (FCM)

Deseo abrir la aplicación automáticamente cuando se recibe la notificación, ¿es esto posible con Firebase y las nuevas notificaciones de FCM?

Sé que puedo establecer click_action, pero eso es solo para personalizar qué actividad se iniciará al hacer clic en la notificación, necesito algo que se inicie automáticamente cuando se reciba la notificación.

Probé la muestra de Firebase de mensajería de inicio rápido y hay un método onMessageReceived () pero solo funciona si la aplicación está en primer plano. ¿Hay algo que se ejecutará mientras la aplicación está en segundo plano también? GCM podría hacer algo como lo que quiero aquí iniciando directamente la intención de actividad del receptor de difusión que se llama cuando se recibe la notificación.

Respuesta rápida:

Para abrir automáticamente una aplicación a través de FCM, debe usar un data-message , que garantiza invocar siempre el método FirebaseMessagingService.onMessageReceived() .

Luego puede agregar su lógica en el método .onMessageReceived() para iniciar la actividad preferida.

ADVERTENCIA: ¡ iniciar una interfaz de usuario sin ninguna interacción del usuario es una muy mala práctica para la mayoría de las aplicaciones! Por favor, lea la respuesta MarkG aquí: ¿Cómo iniciar una actividad de un servicio?

[…] Interrumpir lo que el usuario está haciendo actualmente se considera una mala forma de diseño, especialmente de algo que se supone que está funcionando en segundo plano.
Por lo tanto, debería considerar usar una Notificación […] para iniciar la Actividad deseada cuando el usuario decida que es hora de investigar. […]

Explicación completa:

FCM funciona de manera similar a GCM y puede recibir dos tipos de mensajes:

  1. mensajes de visualización:
    carga útil {"notification" : { "body" : "hello world"}}
    Estos mensajes se muestran automáticamente cuando la aplicación está en segundo plano y llaman a FirebaseMessagingService.onMessageReceived() si la aplicación ya está en primer plano.
  2. mensajes de datos:
    carga útil {"data" : { "key1" : "value1"}}
    Estos mensajes siempre invocan FirebaseMessagingService.onMessageReceived() ,
    incluso si la aplicación está cerrada o en segundo plano.

click_action es un parámetro de la carga de notificación, por lo que se aplica a los mensajes de visualización.

Indica la acción asociada con un usuario, haga clic en la notificación.
Si esto se establece, se inicia una actividad con un filtro de intención coincidente cuando el usuario hace clic en la notificación .

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

Parece que esta sección de la guía es la clave del rompecabezas de las aplicaciones de fondo:

Para recibir mensajes
Use un servicio que amplíe FirebaseMessagingService . Su servicio debe anular la onMessageReceived llamada onMessageReceived , que se proporciona para la mayoría de los tipos de mensajes, con las siguientes excepciones:

Notificaciones entregadas cuando tu aplicación está en segundo plano.
En este caso, la notificación se entrega a la bandeja del sistema del dispositivo. Un usuario toca en una notificación abre el iniciador de aplicaciones de manera predeterminada.

Mensajes con notificación y carga de datos.
En este caso, la notificación se entrega a la bandeja del sistema del dispositivo, y la carga útil de datos se entrega en los extras de la actividad de su iniciador.

Esencialmente, cuando la aplicación está en segundo plano, no es realmente sensible o no se está ejecutando en este punto. Entonces, en cambio, el mensaje se entrega a la bandeja del sistema. Sin embargo, justo debajo, se explica la solución.

Si desea abrir su aplicación y realizar una acción específica [mientras está en segundo plano], establezca click_action en la carga de notificación y asóciela a un filtro de intención en la Actividad que desea iniciar. Por ejemplo, establezca click_action en OPEN_ACTIVITY_1 para activar un filtro de intención como el siguiente:

     

Resumo los pasos aquí, espero que sea útil

PASO 1

Siguiendo la guía del usuario de FCM . Asegúrate de que todo funcione correctamente presionando un mensaje desde la consola de Firebase .

PASO 2

Cambie su clase FirebaseMessagingService personalizada de la siguiente manera:

 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)); } } 

Ahora que usa los mensajes de inserción de la consola de Firebase nuevamente, encontrará que onMessageReceived solo se onMessageReceived cuando su aplicación está en primer plano. Debido a que la consola de Firebase solo puede enviar Notification message . Para enviar un Data message , necesitamos el paso 3.

PASO 3

Instalar el cliente REST avanzado de Google

Entrada debajo de params:

 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 está disponible en la consola de Firebase> panel de configuración> pestaña Cloud Messaging

YOUR_DEVICE_FCM_TOKEN es FirebaseInstanceId.getInstance().getToken() en onTokenRefresh()

NOTA

Al iniciar la IU sin la interacción del usuario hay un mal UX, es posible que deba reemplazar la actividad de inicio con el servicio de inicio o algo en segundo plano. Solo uso la actividad con fines de prueba, por lo que será más visual que el servicio. Gracias @ 2ndgab por presentar la herramienta de cliente REST avanzada de Google.

[Android] Si usa las notificaciones de Firebase (no Firebase Cloud Messaging), todo lo que tiene que hacer es incluir Firebase Messaging en su build.gradle y luego vincular su aplicación a un proyecto en Firebase Console.

Si su aplicación está en segundo plano, cualquier mensaje enviado desde la consola le dará una notificación del sistema, que, si se toca, activará su aplicación.

Eche un vistazo aquí: https://youtu.be/KpTSpVh9SfY?t=10m22s