Crear Notificaciones En Android

Arrancamos esta guía viendo cómo crear notificaciones en Android. Las notificaciones son elementos de UI que proveen información corta, oportuna y relevante al usuario, cuando tu App no está en uso:

Apariencia de notificaciones en Android

A diferencia de los views que usamos en nuestros layouts, las notificaciones son generadas por Android por fuera de tu aplicativo. Por lo que podrás verlas en la barra de estado:

Notificación en barra de estado

En el cajón de notificaciones (notifications drawer):

Como un aviso (heads-up):

Notificación Heads-up

En la pantalla de bloqueo:

O como una insignia (Icon Badge) en el launcher:

Este tutorial da inicio a la guía de notificaciones en Android (todo), en la cual veremos la creación, manejo de comportamientos, configuración y uso de plantillas de notificaciones.


Ejemplo Para Crear Notificaciones En Android

Para ilustrar la creación y despliegue de una notificación, crearemos el siguiente ejemplo:

App de ejemplo para crear notificaciones en Android

Simplificaremos el disparo de la notificación ejecutando la lógica desde el click en un botón. De esta forma nos centraremos en el código de construcción y de paso estableceremos un aplicativo inicial para ir progresando a lo largo de la guía de notificaciones.

Puedes descargar el proyecto desde el siguiente enlace:


Anatomía De Una Notificación En Android

Una notificación consta de tres partes principales en su diseño: (1) la cabecera, (2) el contenido y (3) las acciones:

Anatomía de una notificación en Android

Como ves, la cabecera se compone del icono y nombre de tu App. Opcionalmente puedes añadir un texto de cabecera. El sistema también añade una marca temporal.

En el área de contenido tendrás un titular que describa al evento y un texto secundario con información que respalde al contexto. Adicionalmente puedes añadir un icono grande en la parte derecha.

Y por último en el área de acciones puedes incluir hasta tres botones que permitan al usuario controlar el evento que disparó a la notificación. Es decir, operaciones directas sobre el contenido, inicio de servicios o navegaciones a pantallas de tu App.

Teniendo esto claro, procedamos a establecer nuestro proyecto inicial en Android Studio con un ejemplo que construya y muestre a nuestra primera notificación.


Notificaciones En Android

El framework de Android nos provee a las clases NotificationManagerCompat, NotificationCompat y NotificationChannel desde el paquete androidx.core.app para instanciar a las notificaciones y mostrarlas.

En esencia, ensamblamos el código con las siguientes participaciones:

  1. Crear y registrar un canal de notificaciones (NotificationChannel)
  2. Crear la notificación (NotificationCompat.Builder)
  3. Mostrar la notificación con NotificationManagerCompat.notify()

Soportados por este pequeño plan, pasemos a la implementación.

1. Crear Proyecto

Abre Android Studio y crea un nuevo proyecto llamado Notificaciones En Android y usa como plantilla de actividad inicial a Empty Activity:

Crear notificaciones en Android Studio

Luego abre el layout de la actividad creada por defecto y añade un nuevo botón con el texto «CREAR NOTIFICACIÓN». Posicionalo en el centro del ConstraintLayout:

La definición XML será la siguiente:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/notification_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/create_notification"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

Ahora ve a MainActivity.kt y obtén la referencia del botón. Asigna una escucha OnClickListener y especifica que sea invocado un nuevo método llamado generateNotification():

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        findViewById<Button>(R.id.notification_button).setOnClickListener {
            generateNotification()
        }
    }

    private fun generateNotification() {
        TODO("Not yet implemented")
    }
}

Dentro de este método ejecutaremos la lógica que mencionamos previamente.

2. Crear Canal De Notificación

Desde Android 8.0 es necesario incluir el registro de canales de notificaciones para configurar su estilo visual y la importancia desde el sistema.

En el tutorial sobre configuración de notificaciones (todo) veremos en profundidad su uso. Por el momento interiorizaremos que son representados por la clase NotificationChannel y que instanciamos sus objetos con el método createNotificationChannel().

Para materializar este paso, crea un nuevo método llamado createNotificationChannel() en la actividad y asigna las siguientes sentencias de construcción:

private fun createNotificationChannel() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {   //(1)
        val name = getString(R.string.basic_channel_name)   // (2)
        val channelId = getString(R.string.basic_channel_id) // (3)
        val descriptionText = getString(R.string.basic_channel_description) // (4)
        val importance = NotificationManager.IMPORTANCE_DEFAULT // (5)

        val channel = NotificationChannel(channelId, name, importance).apply { // (6)
            description = descriptionText
        }

        val nm: NotificationManager =
            getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager // (7)
        nm.createNotificationChannel(channel) // (8)
    }
}

En el código anterior:

  1. Determinamos si la versión del SDK es mayor o igual a 26 para crear el canal
  2. Elegimos un nombre para el canal. En este caso será "Notificaciones Básicas" representado por el recurso R.string.basic_channel_name.
  3. Establecemos el identificador para el canal de notificaciones que evidentemente debe ser único. Asignamos el recurso "basic_channel".
  4. Definimos la descripción del canal que será visible para el usuario. En nuestro ejemplo usamos el string "Canal para notificaciones sencillas".
  5. Establecemos la importancia para decirle al sistema cual será el nivel de interrupción que tendrán las notificaciones de este canal. Usaremos la constante DEFAULT_IMPORTANCE para elegir el valor por defecto.
  6. Creamos la instancia del canal con su constructor público y los parámetros anteriores. Luego invocamos a la función de alcance apply() para terminar de configurar la descripción en la misma línea.
  7. Obtenemos la instancia del Notification Manager.
  8. Usamos a createNotificationChannel() para crear en el sistema el canal. Luego de esto ya estará habilitado para liberar las notificaciones asociadas.

Invoca a nuestro createNotificationChannel() desde onCreate() en la actividad:

override fun onCreate(savedInstanceState: Bundle?) {
    //...
    createNotificationChannel()
}

Una vez creado el canal, podemos pasar a la construcción de la notificación.

3. Crear Notificación

Aquí usaremos a la clase NotificationCompat.Builder para crear la notificación que será mostrada.

Para ello usaremos varios métodos set*() asociados a la construcción parcial del elemento. En general, modificaremos los atributos vistos en la anatomía:

private fun generateNotification() {
    val channelId = getString(R.string.basic_channel_id) // (1)
    val largeIcon = BitmapFactory.decodeResource( // (2)
        resources,
        R.drawable.develou
    )

    val notification = NotificationCompat.Builder(this, channelId) // (3)
        .setLargeIcon(largeIcon) // (4)
        .setSmallIcon(R.drawable.ic_circle_notifications) // (5)
        .setContentTitle("Guía De Notificaciones En Android") // (6)
        .setContentText("1. Crear Notificaciones") // (7)
        .setSubText("Develou.com") // (8)
        .setPriority(NotificationCompat.PRIORITY_DEFAULT) // (9)
        .addAction(R.drawable.ic_bookmark,"Leer más tarde", null) // (10)
        .build()
}

En el código anterior:

  1. Obtenemos el ID del canal que creamos anteriormente
  2. Generamos un Bitmap a partir de R.drawable.develou, el cual será asignado en el icono grande de la notificación
  3. Creamos el Builder de la notificación con el contexto actual y el ID del canal de destino
  4. Asignamos el icono grande
  5. Asignamos el icono pequeño
  6. Asignamos el título del contenido
  7. Asignamos el texto de soporte para el contenido
  8. Asignamos el texto de cabecera
  9. Determinamos el nivel de atención que debe prestarle el usuario a la notificación. Veremos más sobre ello en el tutorial de configuración de notificaciones, por el momento asignamos el valor por defecto NotificationCompat.PRIORITY_DEFAULT.
  10. El método addAction() añade un botón en el área de acciones. En este caso añadiremos una acción para «Leer más tarde».

4. Mostrar Notificación

Aunque ya creamos la estructura de la notificación, aún no la se mostrará debido a que es el NotificationManagerCompat el encargado de esta acción:

Mostrar notificaciones en Android

Mostrar la notificación solo consiste en la invocación del método NotificationManagerCompat.notify(), por lo que ponemos al final del método generateNotification():

with(NotificationManagerCompat.from(this)) {
    notify(notificationId, notification)
}

Si deseas, puedes usar el método de instancia from() para obtener al NotificationManagerCompat con el contexto actual. Puedes acompañar esta invocación de with() para proveer al bloque de código el objeto e invocar notify() sin calificación.

Ten en cuenta que el primer parámetro es un entero que representa al ID de la notificación con el fin de tener una referencia para actualizar o remover la notificación.


Manejar Comportamiento De Notificaciones

En este tutorial viste los pasos iniciales para crear y mostrar notificaciones en tus Apps Android. No obstante, esto consiste solo del mecanismo para la construcción visual en el sistema y no el manejo de sus comportamientos.

Es por eso que en el próximo tutorial Manejar Comportamiento De Notificaciones (todo), verás todo lo relacionado con el control de las interacciones que el usuario puede tener con una notificación: click en el contenido, expansión, click en acciones, etc.


Más Contenidos Android

Únete Al Discord De Develou

Si tienes problemas con el código de este tutorial, preguntas, recomendaciones o solo deseas discutir sobre desarrollo Android conmigo y otros desarrolladores, únete a la comunidad de Discord de Develou y siéntete libre de participar como gustes. ¡Te espero!