Bueno, pues después de un largo tiempo, aquí estamos otra vez para hablar sobre Notificaciones Push en Android.
Vamos por fin a cerrar el círculo hablando sobre la parte del cliente y su implementación.
En los post’s anteriores (Introducción e Implementación del Servidor) dimos las pautas a seguir para el uso del GCM y para implementar desde la parte del servidor todas las funciones necesarias para poder recibir y enviar notificaciones push.
Ahora vamos a ver como recibirlas en nuestro dispositivo Android y como gestionarlas. Vamos a dividirlo en dos fases.
En la primera vamos a hablar de como registrar nuestro dispositivo en el GCM y la segunda como recibir notificaciones.
Registrar el dispositivo Android en el GCM
Para el registro del dispositivo podemos hacerlo la primera vez que el dispostivo se registre en nuestra aplicación o la primera vez que la ejecute.
Para ello debemos primero de comprobar si el dispositivo tiene instalado Google Play Services. A continuación, comprobamos si ya hemos registrado el dispositivo en el servicio GCM y en caso negativo procedemos a su registro.
Vamos a ver en unas capturas de pantalla el código comentado que realiza esta parte.
En esta primera captura se muestra como en la función principal comprobamos si tenemos el play services instalado. Posteriormente en caso afirmativo procedemos a comprobar si el dispositivo ha sido ya registrado.
En caso contrario ejecutamos la clase que va a registrar el dispositivo.
En la siguiente imagen se muestran las funciones que comprueban si el tenemos registrado el dispositivo correctamente.
Por último, mostramos la clase que va a registrar nuestro dispositivo en el GCM. Si nos fijamos le pasamos el SENDER_ID, que si recordamos de los post’s anteriores es el id de proyecto que obtuvimos el cuál nos va a relacionar la api key con el dispositivo para que el GCM sepa a que dispositivos van los mensajes.
Posteriormente a esto, podríamos registrar en nuestro servidor el nuevo usuario. Podríamos enviarle el nombre del usuario del dispositivo y el TOKEN que es el registration id que devuelve el GCM cuando registra. Con este token le diremos al GCM a que dispositivos le enviaremos el mensaje, como se vió en el anterior post.
Ahora ya sólo queda trabajar con la recepción de las notificaciones push.
Para ello necesitamos hacer uso de las clases GCMBroadcastReceiver y GCMIntentService.
GCMBroadcastReceiver y GCMIntentService
La clase GCMBroadcastReceiver es sencilla y no es necesario en principio que hagamos nada con ella, por lo que podríamos simplemente copiar y pegar el código de la siguiente captura.
Sin embargo, a la clase GCMIntentService se le puede sacar mucho más jugo. En ella podemos extraer los datos que van a venir en la notificación. Además podemos decidir, por ejemplo, que si estamos dentro de la aplicación no es necesario que la notificación aparezca en nuestra barra de notificaciones si no que puede abrirse un Dialog que nos avise.
A continuación y haciendo uso de la siguiente captura vamos a ver algunas de las cosas que se pueden hacer.
En esta primera parte de la clase podemos ver como se captura la notificación a través del método onHandleIntent.
Empezando por el principio, vemos que tenemos una variable llamada NOTIF_ALERTA_ID, esta variable nos va a ayudar a que una vez que entremos en la app para ver la notificación podamos eliminarla de nuestra barra de notificaciones. En la clase que llamemos debemos poner al principio lo siguiente:
NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.cancel(«BIEN», 1);
Volvamos pues al GCMIntentService después de este inciso.
Dentro de la función onHandleIntent lo primero que hacemos es captar la notificación y extraer el data que enviamos desde nuestro servidor. A continuación vamos a ver en que tarea estamos, lo cuál nos va a ayudar en lo siguiente.
Si el mensaje no viene vacío ni incorrecto, tenemos dos opciones como comenté anteriormente.
- Estar dentro de la aplicación.
- Estar fuera de la aplicación.
Si estamos en el caso uno, entonces la condición que nos dice que el nombre del paquete es com.appandweb.blog será cierta por lo que vamos a lanzar un Dialog que informe al usuario.
Como vemos aquí, lo que hacemos es lanzar una actividad sincronizada que se llama DialogNoti, la cuál extiende de Activity y podemos tratarla como una actividad más. Aunque lo ideal, es hacer un layout como un dialog personalizado y mostrar el mensaje. Para que se muestre como un Dialog en el Manifest DialogNoti tendrá la siguiente característica:
android:theme=«@android:style/Theme.Dialog»
Ahora si estamos en el caso dos, lo que vamos a hacer es mostrar la notificación en la barra de notificaciones que se hace como en la siguiente captura de pantalla.
Como podemos ver en la captura anterior, le pasamos al notification manager los datos necesarios para poder cancelar posteriormente la notificación de nuestra barra de herramientas una vez que estemos dentro de la app como he comentado anteriormente.
Por último, debemos de rellenar el AndroidManifest con los datos necesarios para que funcionen las notificaciones.
Y con esto damos por finalizada la explicación de como utilizar las notificaciones push en Android. Esperamos que os pueda servir de ayuda y estamos abiertos a cualquier tipo de duda o cuestión.
Pronto empezaremos a trabajar en el siguiente post.
hola estimado, le escribo para ver si puede ayudarme, tengo una aplicación que hicieron las notificaciones push con NotificationManager el problema que tengo y no tengo idea como solucionarlo es que las notificaciones no me aparecen cuando tengo la app cerrada, me da la impresión que salen solo cuando están en segundo plano. En xamarin en Vs 2017 Muchas Gracias
El manejo de las notificaciones de Android se puede implementar con varias herramientas (GCM – implementación antigua, FCM – implementación más reciente, entre otras). Dependiendo de como esté implementado, se comportará de un modo u otro. Normalmente existe un servicio que es invocado cuando llega una push, en caso de que el proceso de la App esté eliminado, será el propio sistema operativo el encargado de manejar la push. El comportamiento por defecto (si no se sobreescribe), es montar una notificación (objeto Notificatión del framework) que al pulsarse levantará el Activity que tengamos configurado como punto de entrada. En caso de Xamarin, desconocemos si el funcionamiento es similar o si se sobreescribe este comportamiento.
Esperamos haberte ayudado 🙂 ¡Gracias por comentar!
Hola, tengo el mismo problema que JOHANN MACEO, sin embargo me he dado cuenta que ingresando al administrador de inicio y habilitando el inicio automático en la app desde mi celular, en este si llegan las notificaciones push cuando la app está cerrada. En algunos otros celulares como samsung o huawei llegan las notificaciones sin ningun problema así esté cerrada la app, pero en mi caso (Asus) y en un One Plus no llegan si no se realiza esa modificación.
Hay una manera de realizarla desde código?
Tambien intenté creando un servicio por aparte que se inicie cuando cierro la app, pero el sistema la mata inmediatamente y no vuelve a ser llamado el servicio, vuelve a ser llamado si se realiza la configuración que mencioné anteriormente.
Hola Christian,
Desconocemos si es posible activar este modo de «inicio automático» que comentas desde código, pero por ética de programador, creemos que no se debería hacer sin el consentimiento del usuario. Lo que nosotros haríamos ante un caso similar sería notificar al usuario (mediante un diálogo o una pantalla de Onboarding), y tras explicarle el motivo por el que deseas activar dicha funcionalidad en su pantalla de ajustes, llevarle al menú de ajustes. El código podría ser parecido al que adjuntamos:
https://gist.github.com/appandweb/747e9dcf452ecbc6326729f569ea2686
Para hacer un onboarding de calidad:
https://github.com/apl-devs/AppIntro
Esperamos que te haya sido de ayuda.
¡Muchas gracias por comentar! 🙂