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 este. Los usuarios pueden cambiar estos parámetros de configuración y decidir qué canales de notificaciones de tu app pueden ser intrusivos o visibles.
Mira el siguiente video para obtener una descripción general de los canales y otras funciones de notificaciones en Android 8.0.
Los parámetros de configuración del usuario para 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 un canal de notificaciones, no podrás cambiar el comportamiento de las notificaciones. En ese punto, el usuario tiene el control total. Sin embargo, sí podrás modificar 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 los usuarios realizaron. Por ejemplo, puedes configurar canales de notificaciones separados para cada grupo de conversación que cree el usuario en una app de mensajería.
Cuando segmentas tu app para Android 8.0 (API nivel 26) o versiones posteriores, debes implementar uno o más canales de notificaciones. Si tu targetSdkVersion
se configuró en 25 o inferior, cuando la app se ejecuta en Android 8.0 (API nivel 26) o superior, se comporta igual que en dispositivos con Android 7.1 (API nivel 25) o inferior.
Cómo crear un canal de notificaciones
Para crear un canal de notificaciones, sigue estos pasos:
Construye un objeto
NotificationChannel
con un ID de canal único, un nombre visible para el usuario y un nivel de importancia.De manera opcional, especifica la descripción que el usuario ve en la configuración del sistema con
setDescription()
.Registra el canal de notificaciones pasándolo a
createNotificationChannel()
.
En el siguiente ejemplo, se muestra cómo crear y registrar un canal de notificación:
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); } }
Cuando se vuelve a crear un canal de notificación existente con sus valores originales, no se realiza ninguna operación, por lo que es seguro llamar a este código cuando se inicia 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 deseas personalizar aún más los comportamientos de notificaciones predeterminados 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 estos parámetros 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 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ícalo en el constructor NotificationChannel
con 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, utilizando una constante de prioridad de la clase NotificationCompat
.
Las constantes de importancia (NotificationManager.IMPORTANCE_*
) y 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 ni en el panel. |
IMPORTANCE_NONE |
N/A |
Todas las notificaciones, independientemente de su importancia, aparecen en ubicaciones de la IU no disruptivas del sistema, como 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 a NotificationManager
, no podrás cambiar 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. Si quieres saber qué configuración aplica un usuario a tus canales de notificaciones, sigue estos pasos:
Obtén el objeto
NotificationChannel
llamando agetNotificationChannel()
ogetNotificationChannels()
.Consulta la configuración específica del canal, por ejemplo, con
getVibrationPattern()
,getSound()
ygetImportance()
.
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, como se muestra en la próxima sección.
Cómo abrir la configuración del canal de notificaciones
Una vez que crees un canal de notificaciones, no podrás modificar su comportamiento visual y auditivo de forma programática. Solo el usuario puede cambiar el comportamiento del canal desde la configuración del sistema. Si quieres facilitar el acceso de los usuarios a la configuración de notificaciones, agrega 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 use la acción ACTION_CHANNEL_NOTIFICATION_SETTINGS
.
Por ejemplo, en el siguiente código de ejemplo, se muestra cómo puedes redirigir a 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 especifican 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
Puedes borrar canales de notificaciones llamando a deleteNotificationChannel()
.
En el siguiente código de ejemplo, 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 quieres seguir organizando 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, 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 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 permite que los usuarios los distingan.
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 notificación.
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 modificar la asociación entre un grupo y un canal de notificaciones.