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:
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:
En el cajón de notificaciones (notifications drawer):
Como un aviso (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:
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:
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:
- Crear y registrar un canal de notificaciones (
NotificationChannel
) - Crear la notificación (
NotificationCompat.Builder
) - 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:
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:
- Determinamos si la versión del SDK es mayor o igual a 26 para crear el canal
- Elegimos un nombre para el canal. En este caso será
"Notificaciones Básicas"
representado por el recursoR.string.basic_channel_name
. - Establecemos el identificador para el canal de notificaciones que evidentemente debe ser único. Asignamos el recurso
"basic_channel"
. - Definimos la descripción del canal que será visible para el usuario. En nuestro ejemplo usamos el string
"Canal para notificaciones sencillas"
. - 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. - 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.
- Obtenemos la instancia del Notification Manager.
- 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:
- Obtenemos el ID del canal que creamos anteriormente
- Generamos un Bitmap a partir de R.drawable.develou, el cual será asignado en el icono grande de la notificación
- Creamos el Builder de la notificación con el contexto actual y el ID del canal de destino
- Asignamos el icono grande
- Asignamos el icono pequeño
- Asignamos el título del contenido
- Asignamos el texto de soporte para el contenido
- Asignamos el texto de cabecera
- 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
. - 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 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.