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

  1. SmallIcon
  2. AppName
  3. TimeStamp
  4. LargeIcon
  5. Title
  6. 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:

https://console.firebase.google.com

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

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