Aquí está mi manifiesto
<service android:name=".fcm.PshycoFirebaseMessagingServices">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
<service android:name=".fcm.PshycoFirebaseInstanceIDService">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
</intent-filter>
</service>
Cuando la aplicación está en segundo plano y llega la notificación, llega la notificación predeterminada y no ejecuta mi código de onMessageReceived
.
Aquí está mi onMessageReceived
código. Esto invoca si mi aplicación se ejecuta en primer plano, no cuando la aplicación está en segundo plano. ¿Cómo ejecutar este código cuando la aplicación también está en segundo plano?
// [START receive_message]
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
// TODO(developer): Handle FCM messages here.
// If the application is in the foreground handle both data and notification messages here.
// 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.
data = remoteMessage.getData();
String title = remoteMessage.getNotification().getTitle();
String message = remoteMessage.getNotification().getBody();
String imageUrl = (String) data.get("image");
String action = (String) data.get("action");
Log.i(TAG, "onMessageReceived: title : "+title);
Log.i(TAG, "onMessageReceived: message : "+message);
Log.i(TAG, "onMessageReceived: imageUrl : "+imageUrl);
Log.i(TAG, "onMessageReceived: action : "+action);
if (imageUrl == null) {
sendNotification(title,message,action);
} else {
new BigPictureNotification(this,title,message,imageUrl,action);
}
}
// [END receive_message]
android
firebase
firebase-cloud-messaging
Parth Patel
fuente
fuente
Not getting messages here? See why this may be: goo.gl/39bRNJ
. La solución, como las respuestas a continuación, se puede encontrar en la documentación en Mensajes con notificaciones y cargas de datosRespuestas:
1. ¿Por qué está pasando esto?
Hay dos tipos de mensajes en FCM (Firebase Cloud Messaging):
onMessageReceived()
devolución de llamada solo cuando su aplicación está en primer planoonMessageReceived()
devolución de llamada incluso si su aplicación está en primer plano / en segundo plano / eliminada2. ¿Cómo?
Para lograr esto, debe realizar una
POST
solicitud a la siguiente URL:Encabezados
Content-Type
, Valor:application/json
Authorization
, Valor:key=<your-server-key>
Cuerpo usando temas
O si quieres enviarlo a dispositivos específicos
3. ¿Cómo manejar el mensaje de notificación push?
Así es como maneja el mensaje recibido:
fuente
Firebase team have not developed a UI to send data-messages to your devices, yet.
¿Ha cambiado esto en el último año?onMessageReceived
no se llama y es un problema grave en FCM! También por favor actualice su respuesta.Para hacer que la biblioteca de Firebase llame a su onMessageReceived () en los siguientes casos
no debe poner la 'notificación' de la clave JSON en su solicitud para la API de firebase, sino que debe usar 'datos', consulte a continuación.
El siguiente mensaje no llamará a su onMessageReceived () cuando su aplicación esté en segundo plano o sea eliminada, y no puede personalizar su notificación.
pero en cambio usar esto funcionará
Básicamente, el mensaje se envía en el argumento RemoteMessage junto con su objeto de datos como Map, luego puede administrar la notificación en onMessageReceived como en el fragmento aquí
fuente
Siento que todas las respuestas están incompletas, pero todas tienen algo que necesita para procesar una notificación que tiene datos cuando su aplicación está en segundo plano.
Siga estos pasos y podrá procesar sus notificaciones cuando su aplicación esté en segundo plano.
1.Agregue un filtro de intención como este:
a una actividad que desea procesar los datos de notificación.
Enviar notificaciones con el siguiente formato:
La clave aquí es agregar
donde .MainActivity es la actividad con el filtro de intención que agregó en el paso 1.
Obtenga información de "datos" de la notificación en onCreate de ".MainActivity":
Y eso debería ser todo lo que necesitas hacer. Espero que esto ayude a alguien :)
fuente
De acuerdo con la documentación de Firebase en el envío descendente utilizando Firebase , hay 2 tipos de carga útil:
datos
notificación
Cuando está en primer plano, puede obtener los datos dentro de FCM usando onMessageReceived () , puede obtener sus datos de la carga útil de datos .
Cuando esté en segundo plano, FCM mostrará notificaciones en la bandeja del sistema en función de la información de la carga útil de notificaciones . El título, el mensaje y el icono que se usaron para la notificación en la bandeja del sistema se obtienen de la carga útil de notificaciones .
Esta carga útil de notificación se utiliza cuando desea mostrar automáticamente notificaciones en la bandeja del sistema cuando su aplicación está en segundo plano. Para obtener datos de notificaciones cuando su aplicación está en segundo plano, debe agregar click_action dentro de la carga útil de notificaciones .
Coloque ese filtro de intención en su manifiesto, dentro de una de sus etiquetas de actividad. Cuando haga clic en la notificación, abrirá la aplicación y pasará directamente a la actividad que defina en click_action, en este caso "OPEN_ACTIVTY_1". Y dentro de esa actividad puede obtener los datos de la siguiente manera:
Estoy usando FCM para mi aplicación de Android y uso la carga útil. Aquí está el ejemplo JSON que estoy usando:
fuente
De acuerdo con los documentos
Editar:
Basado en este hilo :
No puedes configurar la carga útil de click_action con Firebase Console. Puede intentar probar con un comando curl o un servidor http personalizado
fuente
Trabajando a partir de julio de 2019
Android compileSdkVersion 28, buildToolsVersion 28.0.3 y firebase-messaging: 19.0.1
Después de muchas horas de investigación a través de todas las otras preguntas y respuestas de StackOverflow, y probando innumerables soluciones obsoletas, esta solución logró mostrar notificaciones en estos 3 escenarios:
- La aplicación está en primer plano:
la notificación se recibe mediante el método onMessageReceived en mi clase MyFirebaseMessagingService
- La aplicación ha sido eliminada (no se está ejecutando en segundo plano): FCM envía automáticamente la notificación a la bandeja de notificaciones. Cuando el usuario toca la notificación, la aplicación se inicia llamando a la actividad que tiene android.intent.category.LAUNCHER en el manifiesto. Puede obtener la parte de datos de la notificación utilizando getIntent (). GetExtras () en el método onCreate ().
- La aplicación está en segundo plano: FCM envía automáticamente la notificación a la bandeja de notificaciones. Cuando el usuario toca la notificación, la aplicación se pone en primer plano al iniciar la actividad que tiene android.intent.category.LAUNCHER en el manifiesto. Como mi aplicación tiene launchMode = "singleTop" en esa actividad, no se llama al método onCreate () porque ya se ha creado una actividad de la misma clase, sino que se llama al método onNewIntent () de esa clase y obtiene la parte de datos de la notificación allí usando intent.getExtras ().
Pasos: 1- Si define la actividad principal de su aplicación de esta manera:
2- agrega estas líneas en el método onCreate () de tu MainActivity.class
y estos métodos a la misma clase MainActivity.class:
3- crea la clase MyFirebase así:
4- crea una nueva clase NotificationActivity.class como esta:
}
5- Agrega estas líneas al Manifiesto de tu aplicación, dentro de tus etiquetas
6- agrega estas líneas en tu método Application.java onCreate (), o en el método MainActivity.class onCreate ():
Hecho.
Ahora, para que esto funcione bien en los 3 escenarios mencionados, debe enviar la notificación desde la consola web de Firebase de la siguiente manera:
En la sección Notificación: Título de notificación = Título para mostrar en el cuadro de diálogo de notificación (opcional) Texto de notificación = Mensaje para mostrar al usuario (obligatorio) Luego en la sección Destino: Aplicación = su aplicación de Android y en la sección Opciones adicionales: Canal de notificación de Android = default_channel_id Clave de datos personalizados: valor del título: (el mismo texto aquí que en el campo Título de la sección de notificaciones) clave: valor del cuerpo: (el mismo texto aquí que en el campo Mensaje de la sección de notificaciones) clave: click_action valor: .MainActivity Sound = Deshabilitado
Caduca = 4 semanas
Puede depurarlo en el emulador con API 28 con Google Play.
¡Feliz codificación!
fuente
Dado
display-messages
que los que se envían desde Firebase Notification UI solo funcionan si tu aplicación está en primer plano. Paradata-messages
, es necesario hacer una llamada POST a FCMPasos
Instale la extensión de Google Chrome del cliente Advanced Rest
Agregue los siguientes encabezados
Clave : Tipo de contenido, Valor : aplicación / json
Clave : Autorización, Valor : clave = "la clave de su servidor"
Agrega el cuerpo
Si usa temas:
Si usa la identificación de registro:
¡Eso es!. Ahora escuche la
onMessageReceived
devolución de llamada como de costumbre.fuente
Para capturar el mensaje en segundo plano, debe utilizar un
BroadcastReceiver
y agregue esto a su manifiesto:
fuente
no se llama cada vez que se llama solo cuando la aplicación está en primer plano
hay un método de anulación al que se llama este método cada vez, no importa qué aplicación esté en primer plano o en segundo plano o eliminada, pero este método está disponible con esta versión de API de Firebase
esta es la versión que tienes que importar desde gradle
este es el método
con la anterior API de Firebase, este método no estaba allí, por lo que en ese caso, la base de fuego se maneja sola cuando la aplicación está en segundo plano ... ahora tiene este método, lo que quiera hacer ... puede hacerlo aquí en este método ... ...
si está utilizando una versión anterior, la actividad predeterminada comenzará en ese caso, puede obtener datos de la misma manera
// Haz lo que quieras .... }
generalmente esta es la estructura del servidor que recibimos en la notificación
depende de usted cómo quiere dar esa clave de datos o si desea dar una notificación a cualquier cosa que pueda dar ... lo que sea que dé aquí con la misma clave obtendrá esos datos ........ .
hay pocos casos si no está enviando una acción de clic en ese caso cuando haga clic en la actividad predeterminada de notificación se abrirá, pero si desea abrir su actividad específica cuando la aplicación está en segundo plano, puede llamar a su actividad desde este método handleIntent porque esto se llama cada vez
fuente
Según los documentos: 17 de mayo de 2017
Por lo tanto, debe usar la notificación de carga útil + los datos:
No hay necesidad de usar click_action. Solo debes obtener exras de la intención en la actividad del LANZADOR
El código Java debe estar en el método onCreate en MainActivity:
Puedes probar los dos datos de notificación de carga útil desde la consola de notificaciones de Firebase . No olvide completar campos de datos personalizados en la sección Opciones avanzadas
fuente
Aquí hay conceptos más claros sobre el mensaje de Firebase. Lo encontré de su equipo de soporte.
** Firebase tiene tres tipos de mensajes **:
Mensajes de notificación : el mensaje de notificación funciona en segundo plano o en primer plano. Cuando la aplicación está en segundo plano, los mensajes de notificación se entregan a la bandeja del sistema. Si la aplicación está en primer plano, los mensajes son manejados por
onMessageReceived()
odidReceiveRemoteNotification
devoluciones de llamada. Estos son esencialmente lo que se denomina Mostrar mensajes.Mensajes de datos : en la plataforma Android, los mensajes de datos pueden funcionar en segundo plano y en primer plano. El mensaje de datos será manejado por onMessageReceived (). Una nota específica de la plataforma aquí sería: en Android, la carga útil de datos se puede recuperar en la intención utilizada para iniciar su actividad. Para elaborar, si tiene
"click_action":"launch_Activity_1"
, puede recuperar esta intencióngetIntent()
solo desdeActivity_1
.Mensajes con notificaciones y cargas de datos : cuando están en segundo plano, las aplicaciones reciben la carga de notificaciones en la bandeja de notificaciones y solo manejan la carga de datos cuando el usuario toca la notificación. Cuando está en primer plano, su aplicación recibe un objeto de mensaje con ambas cargas disponibles. En segundo lugar, el
click_action
parámetro se usa a menudo en la carga de notificación y no en la carga de datos. Si se usa dentro de la carga útil de datos, este parámetro se trataría como un par clave-valor personalizado y, por lo tanto, necesitaría implementar una lógica personalizada para que funcione según lo previsto.Además, le recomiendo que utilice el
onMessageReceived
método (consulte Mensaje de datos) para extraer el paquete de datos. Desde su lógica, verifiqué el objeto del paquete y no he encontrado el contenido de datos esperado. Aquí hay una referencia a un caso similar que podría proporcionar más claridad.Para más información visita mi este hilo
fuente
Respuesta actualizada 2017
Aquí hay una respuesta clara de los documentos con respecto a esto:
fuente
Resumen simple como este
si su aplicación se está ejecutando;
es disparadores.
si su aplicación no se está ejecutando (muere al deslizar);
no se activa y se entrega por direclty. Si tiene algún par especial clave-valor. No funcionan porque onMessageReceived () no funciona.
He encontrado este camino;
En su actividad de iniciador, ponga esta lógica,
en este bloque if, busque sus claves de acuerdo con la interfaz de usuario de firebase.
En este ejemplo, mi clave y valor son los anteriores; (perdón por idioma =))
Cuando mi código funciona, obtengo "com.rda.note".
con esta línea de código, cerré mi aplicación y abrí Google Play Market
codificación feliz =)
fuente
Descubrí los escenarios,
Cuando la aplicación está en primer plano , onMessageReceived () se llama al método de la FirebaseService .So la pendingIntent definido en la clase de servicio.
Y cuando la aplicación está en segundo plano , se llama a la primera actividad .
Ahora, si se utiliza una actividad de bienvenida , a continuación, debe tener en cuenta la splashactivity se llamará, de lo contrario, si no hay splashActivity, a continuación, cualquiera que sea la primera actividad es, será llamado.
Luego debe verificar getIntent () de firstActivity para ver si tiene algún paquete. Si todo está bien, verá que el paquete está allí con los valores completados. Si el valor en la etiqueta de datos enviada desde el servidor se ve así,
Luego, en la primera actividad, verá, hay una intención válida ( getIntent () no es nulo ), paquete válido y paquete interno, habrá todo el JSON mencionado anteriormente con datos como clave .
Para este escenario, el código para la extracción de valor se verá así,
fuente
Gracias a todos por sus respuestas. Pero resolví esto enviando un mensaje de datos en lugar de enviar una Notificación . Código del servidor
Y capturó los datos en onMessageReceived
fuente
Elimine la carga de notificación por completo de su solicitud de servidor. Envíe solo datos y trátelos
onMessageReceived()
, de lo contrarioonMessageReceived
, no se activará cuando la aplicación esté en segundo plano o se cierre.Esto es lo que estoy enviando desde el servidor:
Para que pueda recibir sus datos de
onMessageReceived(RemoteMessage message)
esta manera: (digamos que tengo que obtener la identificación)Y de manera similar, puede obtener cualquier información que haya enviado desde el servidor
onMessageReceived()
.fuente
La manera fácil de enviar mensajes incluso si la aplicación está en segundo plano y en primer plano de la siguiente manera: - Para enviar un mensaje usando API, puede usar una herramienta llamada AdvancedREST Client, es una extensión de Chrome, y enviar un mensaje con los siguientes parámetros.
Enlace de la herramienta cliente de descanso: https://chrome.google.com/webstore/detail/advanced-rest-client/hgmloofddffdnphfgcellkdfbfbjeloo
use esta url: - https://fcm.googleapis.com/fcm/send Content-Type: application / json Autorización: key = la clave de su servidor o la clave de autorización (consulte la referencia a continuación)
La clave de autorización se puede obtener visitando la consola de desarrolladores de Google y haciendo clic en el botón Credenciales en el menú de la izquierda para su proyecto. Entre las claves API enumeradas, la clave del servidor será su clave de autorización.
Y debe colocar el tokenID del receptor en la sección "para" de su solicitud POST enviada mediante API.
fuente
desea trabajar enMessageReceived (RemoteMessage remoteMessage) en segundo plano enviar solo notificación de parte de datos, parte esto:
"AnotherActivity": "True", "to": "id del dispositivo o token del dispositivo"
Con esto, onMessageRecivied es un fondo de llamada y un primer plano sin necesidad de manejar la notificación usando la bandeja de notificaciones en su actividad de iniciador. Maneje la carga útil de datos al usar esto:
fuente
Respuesta de junio de 2018 -
Debe asegurarse de que no haya una palabra clave de "notificación" en ninguna parte del mensaje. Solo incluya "datos", y la aplicación podrá manejar el mensaje en onMessageReceived, incluso en segundo plano o muerto.
Uso de funciones en la nube:
Luego, en su onMessageReceived (), en su clase que extiende com.google.firebase.messaging.FirebaseMessagingService:
fuente
De acuerdo con OAUTH 2.0:
Habrá un problema de autenticación para este caso porque FCM ahora usa OAUTH 2
Entonces leí la documentación de Firebase y, según la documentación, es una nueva forma de publicar un mensaje de datos;
Encabezados
Autenticación
Cuerpo de ejemplo
En la URL hay un Id. De base de datos que puede encontrar en su consola Firebase. (Ir a los ajustes del proyecto)
Y ahora tomemos nuestro token (será válido solo 1 hora):
Primero en la consola de Firebase, abra Configuración> Cuentas de servicio . Haga clic en Generar nueva clave privada , guarde de forma segura el archivo JSON que contiene la clave. Necesitaba este archivo JSON para autorizar las solicitudes del servidor manualmente. Lo descargué.
Luego creo un proyecto node.js y utilicé esta función para obtener mi token;
Ahora puedo usar este token en mi solicitud de publicación. Luego publico mi mensaje de datos, y ahora lo manejan mis aplicaciones en la función MensajeRecibido.
fuente
Desde 2019, Google Firebase tiene un gran cambio en sus API, quiero decir:
'com.google.firebase:firebase-messaging:18.0.0'
en 18.0.0 se eliminaron
MyFirebaseInstanceIDService
y necesitas obtener un token,MyFirebaseMessagingService
así que solo necesitas escribir:y también en su AndroidManifest.xml, debe eliminar:
Además, se recomienda establecer valores predeterminados para personalizar la apariencia de las notificaciones. Puede especificar un icono predeterminado personalizado y un color predeterminado personalizado que se apliquen siempre que no se establezcan valores equivalentes en la carga de notificación.
Agregue estas líneas dentro de la etiqueta de la aplicación para establecer el icono predeterminado personalizado y el color personalizado:
ahora para manejar los mensajes de notificación en una aplicación en segundo plano, debe definir un Intento en su primera Actividad, incluso si es SplashScreen. Cuando su aplicación está en segundo plano, Android dirige los mensajes de notificación a la bandeja del sistema. Un usuario que toca la notificación abre el iniciador de aplicaciones de forma predeterminada.
por ejemplo, si tu Json es así:
solo necesita escribir una intención simple para obtener esos valores:
fuente
Además de las respuestas anteriores, si está probando notificaciones push utilizando la consola FCM , la clave y el objeto 'datos' no se agregan al paquete de notificaciones push. Por lo tanto, no recibirá notificaciones push detalladas cuando la aplicación esté en segundo plano o se cierre.
En este caso, debe optar por su consola de administración de back-end para probar el escenario de fondo de la aplicación.
Aquí, habrá agregado la clave 'datos' a su paquete push. entonces, el empuje detallado se mostrará como se esperaba. Espero que esto ayude a pocos.
fuente
Usando este código puede obtener la notificación en segundo plano / primer plano y también poner acción:
En la aplicación, use este código:
fuente
Habrá dos tipos de notificaciones.
Debe usar las notificaciones de datos para manejar la notificación cuando la aplicación está en segundo plano.
fuente
Experimenté el mismo problema y recompilé la biblioteca de Firebase y evité que enviara notificaciones cuando la aplicación está en segundo plano.
* biblioteca https://github.com/erdalceylan/com-google-firebase-messaging
* *
La esperanza ayuda. Buena suerte
fuente