Cómo crear y administrar canales de notificaciones

A partir de Android 8.0 (nivel de API 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 ese canal. Los usuarios pueden cambiar esta configuración y decidir qué canales de notificaciones de la app pueden ser intrusivos o visibles.

Mira el siguiente video para obtener una descripción general de los canales y otras funciones de notificaciones de Android 8.0.

La configuración del usuario para los canales de notificaciones está disponible para cada app en la configuración del sistema, como se muestra en la Figura 1.

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

Después de crear un canal de notificaciones, no puedes cambiar los comportamientos de las notificaciones. El usuario tiene el control total en ese momento. Sin embargo, podrás cambiar el nombre y la descripción del canal.

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

Cuando orientes tu contenido a Android 8.0 (nivel de API 26) o versiones posteriores, debes implementar uno o varios canales de notificaciones. Si tu targetSdkVersion está configurada en 25 o una versión anterior, cuando tu app se ejecute en Android 8.0 (nivel de API 26) o versiones posteriores, se comportará de la misma manera que en dispositivos con Android 7.1 (nivel de API 25) o versiones anteriores.

Cómo crear un canal de notificaciones

Para crear un canal de notificaciones, sigue estos pasos:

  1. Construye 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. Para registrar el canal de notificaciones, pásalo a createNotificationChannel().

En el siguiente ejemplo, se muestra cómo crear y registrar un canal de notificaciones:

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 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);
    }
}

La recreación de un canal de notificaciones existente con sus valores originales no realiza operaciones, por lo que es seguro llamar a este código cuando inicias una app.

De forma predeterminada, todas las notificaciones publicadas en un canal determinado usan los comportamientos visuales y auditivos definidos por el nivel de importancia de la clase NotificationManagerCompat, como IMPORTANCE_DEFAULT o IMPORTANCE_HIGH. Consulta la siguiente sección para obtener más información sobre los niveles de importancia.

Si quieres personalizar aún más los comportamientos predeterminados de las notificaciones de tu canal, puedes llamar a métodos como enableLights(), setLightColor() y setVibrationPattern() en NotificationChannel. Recuerda que, una vez que crees el canal, no podrás cambiar la configuración, y el usuario tendrá el control final sobre si esos comportamientos están activos.

También puedes crear varios canales de notificaciones en una sola operación llamando 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 él. Especifícala en el constructor NotificationChannel mediante uno de los cinco niveles de importancia, que van desde IMPORTANCE_NONE(0) hasta IMPORTANCE_HIGH(4).

Para admitir dispositivos con Android 7.1 (nivel de API 25) o versiones anteriores, también debes llamar a setPriority() para cada notificación usando 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 muestra en la siguiente tabla.

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 de atención.
IMPORTANCE_HIGH PRIORITY_HIGH o PRIORITY_MAX
Alta
Emite un sonido.
IMPORTANCE_DEFAULT PRIORITY_DEFAULT
Media
No emite sonido.
IMPORTANCE_LOW PRIORITY_LOW
Baja
No emite sonido y no aparece en la barra de estado.
IMPORTANCE_MIN PRIORITY_MIN
Ninguno
No emite sonido y no aparece en la barra de estado o en el panel.
IMPORTANCE_NONE N/A

Todas las notificaciones, independientemente de su importancia, aparecen en ubicaciones no disruptivas de la IU del sistema, como en el panel lateral de notificaciones o como insignias en el ícono de selector. Sin embargo, puedes modificar el aspecto de la insignia de notificación.

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

Para obtener información sobre cómo elegir un nivel de prioridad adecuado, consulta "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 el sonido de alerta. Si deseas conocer la configuración que aplica un usuario a tus canales de notificaciones, sigue estos pasos:

  1. Llama a getNotificationChannel() o a getNotificationChannels() para obtener el objeto NotificationChannel.

  2. Consulta la configuración específica del canal, como getVibrationPattern(), getSound() y getImportance().

Si detectas una configuración del canal que crees que inhibe el comportamiento previsto para tu app, puedes sugerir que el usuario la cambie y proporcionar una acción para abrir la configuración del canal, como se muestra en la siguiente sección.

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

Después de crear un canal de notificaciones, no puedes cambiar sus comportamientos visuales y auditivos de manera programática. Solo el usuario puede cambiar los comportamientos del canal desde la configuración del sistema. Para facilitar el acceso de los usuarios a la configuración de notificaciones, agrega un elemento en la IU de configuración de la app que abra la configuración del sistema.

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

Por ejemplo, en el siguiente código de muestra, se indica cómo redireccionar un usuario a la configuración de un 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 del paquete de la app (también conocido como el ID de aplicación) y el canal para editarlo.

Cómo borrar un canal de notificaciones

Para borrar canales de notificaciones, llama a deleteNotificationChannel(). En el siguiente código de muestra, se muestra cómo completar 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 deseas organizar aún más 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 usuario, como en los perfiles de trabajo, ya que te permite 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 redes sociales podría incluir la compatibilidad con cuentas personales y de trabajo. En esta situación, cada cuenta puede 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 permite a los usuarios distinguir entre ellos.

Cada grupo de canales de notificaciones requiere un ID, que debe ser único dentro de tu paquete, así como 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);
notificationManager.createNotificationChannelGroup(new NotificationChannelGroup(groupId, groupName));

Después de crear un grupo nuevo, puedes llamar a setGroup() para asociar un objeto NotificationChannel nuevo al grupo.

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