CLASE 05
Notificaciones
Notificaciones
Las notificaciones son mensajes que se pueden mostrar en la pantalla, de manera externa a nuestra aplicación. Cuando nosotros mostramos una notificación aparece en la status bar como un ícono, y para ver el detalle de la misma el usuario debe deslizar este status bar hacia abajo y así se visualiza el buzón de notificaciones.
Notificaciones
Status Bar


Buzon de Notificaciones
Notificaciones
Anatomia de una Notificacion

- SmallIcon
- AppName
- TimeStamp
- LargeIcon
- Title
- Content
Notificaciones
Desde Android 5.0 las notificaciones pueden aparecer brevemente en una ventana flotante llamada HEADS UP NOTIFICATION.

Este deberia ser el comportamiento normal de una notificacion de la cual el usuario deba conocer en el instante, y solo aparecen si el dispositivo esta desbloqueado
Notificaciones
Este HEADS UP NOTIFICATION aparece en el instante que la app envia la notificacion y desaparece unos segundos despues.
Las siguientes son algunas de las condiciones que podria disparar un heads up:
- La actividad actual esta en modo PANTALLA COMPLETA
- La notificacion es de ALTA PRIORIDAD y usa SONIDO o VIBRACION, en dispositivos con Android 7.1+
- El canal de notificacion es de ALTA IMPORTANCIA es dispositivos con Android 8.0+
MOSTRAR NOTIFICACIÓN
Notificacion + Alarma
Intent intent = new Intent(MainActivity.this, AlarmReceiver.class);
PendingIntent alarmIntent = PendingIntent.getBroadcast(MainActivity.this,
0,
intent,
0);
int tipoAlarma = AlarmManager.ELAPSED_REALTIME;
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
alarmManager.set(tipoAlarma,
SystemClock.elapsedRealtime() + (1000 * 10),
alarmIntent);
finish();
La alarma que vamos a elegir, por simpleza es la de Tiempo Real Transcurrido. Notemos que en este caso no vamos a mostrar una actividad, sino lanzar un broadcast, y por eso usamos getBroadcast en lugar del getActivity que usamos antes:
Notificacion + Alarma
Log.e(TAG, "Alarma recibida");
// Creamos la notificacion
String channelID = "myChannel";
NotificationCompat.Builder notiBuilder = new NotificationCompat.Builder(mContext, channelID);
notiBuilder.setContentTitle("Titulo"); // Titulo de la notificacion
notiBuilder.setContentText("Contenido"); // Contenido de la notificacion
notiBuilder.setTicker("Este es el ticker"); // DEPRECADO
notiBuilder.setSmallIcon(R.mipmap.ic_launcher); // Icono
// To show the heads up notification when it arrives (it also requies SOUND and VIBE)
notiBuilder.setPriority(Notification.PRIORITY_HIGH);
// Lanzamos la notificacion
NotificationManager notiMan = (NotificationManager)
context.getSystemService(Context.NOTIFICATION_SERVICE);
notiMan.notify(ALARM_NOTIFICATION_ID, notiBuilder.build());
Luego, vamos a necesitar el Receiver que reciba esta alarma y nos lance la notificación:
Y no se olviden, que este receiver debe estar declarado en el manifiesto de nuestra app.
Notificacion + Alarma
notiBuilder.setSound(Settings.System.DEFAULT_NOTIFICATION_URI);
notiBuilder.setVibrate(new long[]{1000,100});
Si luego le queremos agregar SONIDO y VIBRACION
Para vibrar el telefono, debemos agregar el permiso en el manifiesto
<uses-permission android:name="android.permission.VIBRATE" />
Notificacion + Alarma
Si queremos abrir una activity al clickear:
Intent notiIntent = new Intent(context, MainActivity.class);
PendingIntent notiPendingIntent = PendingIntent.getActivity(context, 0, notiIntent, 0);
notiBuilder.setContentIntent(notiPendingIntent);
Si queremos lanzar un broadcast al dismiss
Intent intent = new Intent(mContext, NotificationDismissedReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, 0, intent, 0);
notiBuilder.setDeleteIntent(pendingIntent);
Notificacion + Alarma
Desde Android 7.0, podemos agregar acciones a las notificaciones.
La forma de hacerlo es similar a como lo hacemos al setear un intento para el contenido o delete.
Intent snoozeIntent = new Intent(this, MyBroadcastReceiver.class);
snoozeIntent.setAction(ACTION_SNOOZE);
PendingIntent snoozePendingIntent = PendingIntent.getBroadcast(this, 0, snoozeIntent, 0);
.addAction(R.drawable.ic_snooze, getString(R.string.snooze),
snoozePendingIntent);

PUSH NOTIFICATIONS
Push Notificacions

Push Notificacions
Anteriormente se usaba el servicio de Google Cloud Messaging, ahora se reemplazo por el Servicio de Firebase (que lo compró Google).
De modo que las Notificaciones Push, las vamos a manejar con Firebase Cloud Messaging.
Lo primero que debemos hacer es loguearnos en la consola de desarrolladores Firebase, con nuestras credenciales de Google:
Push Notificacions
Lo primero que hacemos es crear un nuevo proyecto (Create New Project). Debemos darle un nombre e indicar nuestra región.
Luego clickeamos sobre Add Firebase to Android App, y debemos ingresar el nombre del paquete de nuestra app. Al hacerlo se va a descargar automaticamente un archivo llamado google-services.json, el cual debemos agregar a nuestra app.
Hay que copiarlo al raiz de nuestra aplicacion (carpeta app/)
Push Notificacions
Luego tenemos que editar le gradle script del proyecto y el de la aplicación.
En el del proyecto, debemos agregar (como dependencia):
classpath 'com.google.gms:google-services:3.0.0'
Y en el de la aplicación (al final de todo):
apply plugin: 'com.google.gms.google-services'
Finalmente, y como es de esperar, necesitamos permiso para acceder a Internet
<uses-permission android:name="android.permission.INTERNET" />
Push Notificacions
Para probar que hayamos hecho todo correctamente, vamos al menu Notifications en la barra de navegación lateral y enviamos nuestra primer notificacion.
Antes de hacerlo, debemos haber corrido la app previamente, y la aplicación no puede estar abierta en ese momento.
Push Notificacions
¿Por qué las 2 restricciones anteriores? En primer lugar la app debe iniciarse al menos una vez, para "registrarse" con el servicio y que sea una de las app que reciba esas notificaciones.
Y en segundo lugar, la app no puede estar abierta, porque cuando la app está en background Android OS se encargan de mostrarla. En cambio cuando la app está abierta, es nuestra responsabilidad hacerlo.
Push Notificacions
Para mostrar la notificación, lo primero que debemos hacer es crear un nuevo servicio que extiende de los servicios de mensajeria de Firebase
public class MyFirebaseMessagingService extends FirebaseMessagingService
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
}
}
Éste debe ser declarado en el Manifiesto con un filtro para los eventos de mensajeria de Firebase
<service
android:name=".MyFirebaseMessagingService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
Push Notificacions
El método onMessageReceived va a ser el que se va a invocar cuando recibamos la notificación y de ahí la podemos mostrar.
Recibimos el mensaje, extraemos sus datos y lanzamos una notificacion tal y como lo hicimos antes
remoteMessage.getNotification().getBody()
DEMO APP
DEMO APP
La aplicación de DEMO, la pueden encontrar en:
http://sebasira.com.ar/firebaseTest/FCMclient%20v1.0.apk
Luego, para enviar una notificacion deberán ingresar en:
http://sebasira.com.ar/firebaseTest/sendPushNotification.php
Referencias:
https://www.simplifiedcoding.net/android-push-notification-tutorial-using-firebase/
Gracias!
No dejen de consultar cualquier duda que surja
sebasira@gmail.com
Android Avanzando - Clase 05
By Ing. Sebastian M. Irazabal
Android Avanzando - Clase 05
- 693