Cómo crear y administrar canales de notificaciones

A partir de Android 8.0 (API nivel 26), todas las notificaciones deben asignarse a un canal. En cada canal, puedes configurar el comportamiento visual y auditivo que se aplicará a todas las notificaciones de este. Luego, los usuarios pueden modificar estas opciones de configuración y decidir qué canales de notificaciones de tu app deben ser intrusivos o visibles.

Echa un vistazo al video que aparece debajo para obtener una descripción general de los canales y otras funciones de notificaciones nuevas de Android 8.0.

Para obtener un ejemplo de código que usa notificaciones, incluidas las funciones de Android 8.0, consulta el Ejemplo de notificaciones de Android.

Las opciones de configuración del usuario de los canales de notificaciones están disponibles para cada app en la configuración del sistema, como se muestra en la figura 1.

Figura 1: Configuración de notificaciones para la app de Reloj y uno de sus canales

Una vez que crees el canal de notificaciones, no podrás modificar el comportamiento de las notificaciones porque, a partir de ese momento, el usuario tendrá el control total. No obstante, sí podrás modificar el nombre y la descripción del canal.

Debes crear un canal para cada tipo de notificación que necesites enviar. También puedes crear canales de notificaciones a fin de reflejar las elecciones que los usuarios realizaron en tu app. Por ejemplo, puedes configurar canales de notificaciones separados para cada grupo de conversación que crea el usuario en una app de mensajería.

Cuando orientas tu app a Android 8.0 (API nivel 26), debes implementar uno o varios canales de notificaciones. Si configuras la targetSdkVersion en 25 o una versión anterior, cuando tu app se ejecute en Android  8.0 (API nivel 26) o una versión posterior, se comportará de la misma manera en que lo haría en dispositivos que ejecutan Android 7.1 (API nivel 25) o una versión anterior.

Cómo crear un canal de notificaciones

Para crear un canal de notificaciones, sigue estos pasos:

  1. Crea un objeto NotificationChannel con un ID de canal único, un nombre visible para el usuario y un nivel de importancia.
  2. De manera opcional, especifica la descripción que el usuario ve en la configuración del sistema con setDescription().
  3. Pasa el canal de notificaciones a createNotificationChannel() para registrarlo.

Kotlin

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        // Create the NotificationChannel
        val name = getString(R.string.channel_name)
        val descriptionText = getString(R.string.channel_description)
        val importance = NotificationManager.IMPORTANCE_DEFAULT
        val mChannel = NotificationChannel(CHANNEL_ID, name, importance)
        mChannel.description = descriptionText
        // Register the channel with the system; you can't change the importance
        // or other notification behaviors after this
        val notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
        notificationManager.createNotificationChannel(mChannel)
    }
    

Java

    private void createNotificationChannel() {
        // Create the NotificationChannel, but only on API 26+ because
        // the NotificationChannel class is new and not in the support library
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            CharSequence name = getString(R.string.channel_name);
            String description = getString(R.string.channel_description);
            int importance = NotificationManager.IMPORTANCE_DEFAULT;
            NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);
            channel.setDescription(description);
            // Register the channel with the system; you can't change the importance
            // or other notification behaviors after this
            NotificationManager notificationManager = getSystemService(NotificationManager.class);
            notificationManager.createNotificationChannel(channel);
        }
    }
    

Cuando se crea un canal de notificaciones existente con sus valores originales, no se realiza ninguna operación, por lo que es seguro llamar a este código cuando inicias un app.

De forma predeterminada, todas las notificaciones que se publican en este canal usan el comportamiento visual y auditivo que definió el nivel de importancia de la clase NotificationManagerCompat, como IMPORTANCE_DEFAULT y IMPORTANCE_HIGH. Obtén más información sobre los niveles de importancia a continuación.

Si deseas seguir personalizando el comportamiento predeterminado de las notificaciones, puedes llamar a los métodos, como enableLights(), setLightColor() y setVibrationPattern() en el NotificationChannel. Sin embargo, ten en cuenta que una vez que crees el canal, ya no podrás cambiar las opciones de configuración y el usuario tendrá el control final sobre la activación o desactivación de estos comportamientos.

También puedes crear varios canales de notificaciones en una sola operación mediante una llamada a createNotificationChannels().

Cómo establecer el nivel de importancia

La importancia del canal afecta el nivel de interrupción de todas las notificaciones que se publican en este y debes especificarlo en el constructor NotificationChannel. Puedes usar uno de los cinco niveles de importancia, que varían desde IMPORTANCE_NONE(0) a IMPORTANCE_HIGH(4). El nivel de importancia que asignas a un canal se aplica a todos los mensajes de notificaciones que publicas en este.

Para agregar compatibilidad con dispositivos que ejecutan Android 7.1 (API nivel 25) o versiones anteriores, también debes llamar a setPriority() para cada notificación por medio de una constante de prioridad de la clase NotificationCompat.

Las constantes de importancia (NotificationManager.IMPORTANCE_*) y de prioridad (NotificationCompat.PRIORITY_*) se asignan a las opciones de importancia visibles para el usuario como se indica en la tabla 1.

Tabla 1: Niveles de importancia del canal

Nivel de importancia visible para el usuario Importancia (Android 8.0 y versiones posteriores) Prioridad (Android 7.1 y versiones anteriores)
Urgente
Emite un sonido y aparece como una notificación emergente
IMPORTANCE_HIGH PRIORITY_HIGH o PRIORITY_MAX
Alta
Emite un sonido
IMPORTANCE_DEFAULT PRIORITY_DEFAULT
Media
Sin sonido
IMPORTANCE_LOW PRIORITY_LOW
Baja
No emite sonido ni aparece en la barra de estado
IMPORTANCE_MIN PRIORITY_MIN

Todas las notificaciones, independientemente de su importancia, aparecen en ubicaciones de la IU no disruptivas, por ejemplo, en el panel lateral de notificaciones o como insignias en el ícono de selector (aunque puedes modificar el aspecto de la insignia de notificación).

Una vez que envíes el canal al NotificationManager, no podrás modificar el nivel de importancia. Sin embargo, el usuario podrá modificar las preferencias para los canales de tu app en cualquier momento.

Para obtener información sobre cómo elegir un nivel de prioridad adecuado, consulta la sección "Niveles de prioridad" en la Guía de diseño de notificaciones.

Cómo leer la configuración del canal de notificaciones

Los usuarios pueden modificar la configuración de los canales de notificaciones, incluidos los comportamientos como la vibración y la alerta de sonido. Por lo tanto, si quieres saber qué configuración aplicó un usuario a tus canales de notificaciones, sigue estos pasos:

  1. Llama a getNotificationChannel() o getNotificationChannels() para obtener el objeto NotificationChannel.
  2. Consulta la configuración específica del canal, como getVibrationPattern(), getSound() y getImportance().

Luego, si detectas que la configuración de un canal inhibe el comportamiento previsto de tu app, puedes sugerir al usuario que la modifique y proporcionarle una acción para abrir la configuración del canal (consulta la próxima sección).

Cómo abrir la configuración del canal de notificaciones

Una vez que creaste un canal de notificaciones, no podrás modificar su comportamiento visual y auditivo de forma programática. Solo el usuario puede hacerlo desde la configuración del sistema. Si quieres facilitar el acceso de los usuarios a la configuración de notificaciones, deberías agregar un elemento en la IU de configuración de tu app que abra esa configuración del sistema.

Puedes abrir la configuración del sistema para los canales de notificaciones con un Intent que usa la acción ACTION_CHANNEL_NOTIFICATION_SETTINGS.

Por ejemplo, en el siguiente código de ejemplo, se muestra cómo redirigir un usuario a la configuración del canal de notificaciones:

Kotlin

    val intent = Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS).apply {
        putExtra(Settings.EXTRA_APP_PACKAGE, packageName)
        putExtra(Settings.EXTRA_CHANNEL_ID, myNotificationChannel.getId())
    }
    startActivity(intent)
    

Java

    Intent intent = new Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS);
    intent.putExtra(Settings.EXTRA_APP_PACKAGE, getPackageName());
    intent.putExtra(Settings.EXTRA_CHANNEL_ID, myNotificationChannel.getId());
    startActivity(intent);
    

Ten en cuenta que el intent requiere dos extras que especifiquen el nombre de paquete de tu app (también conocido como ID de app) y el canal para editarlo.

Cómo borrar un canal de notificaciones

Llama a deleteNotificationChannel() para borrar canales de notificaciones. En el siguiente código de ejemplo, se muestra cómo realizar este proceso:

Kotlin

    // The id of the channel.
    val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
    val id: String = "my_channel_01"
    notificationManager.deleteNotificationChannel(id)
    

Java

    NotificationManager notificationManager =
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    // The id of the channel.
    String id = "my_channel_01";
    notificationManager.deleteNotificationChannel(id);
    

Cómo crear un grupo de canales de notificaciones

Si quieres seguir administrando la apariencia de tus canales en la IU de configuración, puedes crear grupos de canales. Esta opción resulta útil cuando tu app admite varias cuentas de usuarios (como los perfiles de trabajo), de modo que puedes crear un grupo de canales de notificaciones para cada cuenta. De esta manera, los usuarios pueden identificar y controlar fácilmente varios canales de notificaciones que tienen nombres idénticos.

Figura 2: Configuración del canal de notificaciones con grupos para cuentas personales y de trabajo

Por ejemplo, una app de red social podría incluir la compatibilidad con cuentas personales y de trabajo. En este caso, cada cuenta podría requerir varios canales de notificaciones con funciones y nombres idénticos, como los siguientes:

  • Una cuenta personal con dos canales:
    • Comentarios nuevos
    • Recomendaciones de publicaciones
  • Una cuenta comercial con dos canales:
    • Comentarios nuevos
    • Recomendaciones de publicaciones

Organizar los canales de notificaciones en grupos para cada cuenta garantiza que los usuarios puedan distinguirlos fácilmente.

Cada grupo de canales de notificaciones requiere un ID que debe ser único dentro de tu paquete, además de un nombre visible para el usuario. En el siguiente fragmento, se muestra cómo crear un grupo de canales de notificaciones.

Kotlin

    // The id of the group.
    val groupId = "my_group_01"
    // The user-visible name of the group.
    val groupName = getString(R.string.group_name)
    val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
    notificationManager.createNotificationChannelGroup(NotificationChannelGroup(groupId, groupName))
    

Java

    // The id of the group.
    String groupId = "my_group_01";
    // The user-visible name of the group.
    CharSequence groupName = getString(R.string.group_name);
    NotificationManager notificationManager =
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    mNotificationManager.createNotificationChannelGroup(new NotificationChannelGroup(groupId, groupName));
    

Luego de crear un grupo nuevo, puedes llamar a setGroup() para asociar un objeto NotificationChannel nuevo con este.

Una vez que envíes el canal al administrador de notificaciones, ya no podrás modificar la asociación entre un grupo y un canal de notificaciones.