Este artículo explora diversas funcionalidades para la gestión de notificaciones en aplicaciones Android, detallando su implementación y configuración.
- Notificaciones Fundamentales
Para crear una notificación básica, se utiliza la clase Notification.Builder. A partir de Android 8.0 (API nivel 26), es obligatorio asociar un channelId a la notificación y crear un NotificationChannel correspondiente. A continuación, se presenta un ejemplo de código:
public void generarNotificacionBasica(View vista) {
Notification.Builder constructorNotificacion;
String idCanal = "mi_canal_notificaciones"; // Identificador único del canal
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
constructorNotificacion = new Notification.Builder(this, idCanal);
} else {
constructorNotificacion = new Notification.Builder(this);
}
constructorNotificacion.setSmallIcon(R.mipmap.ic_launcher); // Ícono pequeño
constructorNotificacion.setAutoCancel(true); // Eliminar notificación al ser tocada
constructorNotificacion.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher)); // Ícono grande
constructorNotificacion.setContentTitle("Notificación Sencilla"); // Título principal
constructorNotificacion.setContentText("Esta es una notificación básica."); // Texto descriptivo
constructorNotificacion.setSubText("Nivel básico"); // Texto secundario
// Configuración de la acción al tocar la notificación
Intent intencion = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.ejemplo.com"));
PendingIntent intencionPendiente = PendingIntent.getActivity(this, 0, intencion, PendingIntent.FLAG_IMMUTABLE);
constructorNotificacion.setContentIntent(intencionPendiente);
NotificationManager gestorNotificaciones = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
// Creación del canal de notificación para Android 8.0+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel canal = new NotificationChannel(idCanal, "Nombre del Canal", NotificationManager.IMPORTANCE_LOW);
// IMPORTANCE_LOW: Notificación visible en la barra de estado, sin sonido ni interrupción visual.
gestorNotificaciones.createNotificationChannel(canal);
}
int idNotificacionUnica = 1; // Identificador único para esta notificación
gestorNotificaciones.notify(idNotificacionUnica, constructorNotificacion.build());
}
Consideraciones importantes:
- La longitud máxima para
channelIdy el nombre del canal es de 40 caracteres; de lo contrario, se truncarán. - Cada
channelIddentro de una aplicación debe ser único. Si se reutiliza un ID, las notificaciones posteriores con el mismo ID sobrescribirán las anteriores.
- Notificaciones Colapsadas (Personalizadas)
Para personalizar la apariencia de una notificación cuando está colapsada, se utilizan RemoteViews. Esto permite definir un layout de notificación propio.
// ... (dentro del método del builder) ...
// Layout para la vista colapsada
RemoteViews vistaContenido = new RemoteViews(getPackageName(), R.layout.layout_notificacion_colapsada);
vistaContenido.setTextViewText(R.id.id_texto_notificacion, "Mensaje para vista colapsada");
constructorNotificacion.setCustomContentView(vistaContenido);
// Layout para la vista expandida (opcional)
RemoteViews vistaContenidoExpandido = new RemoteViews(getPackageName(), R.layout.layout_notificacion_expandida);
// ... (configurar elementos en vistaContenidoExpandido) ...
constructorNotificacion.setCustomBigContentView(vistaContenidoExpandido);
Los archivos XML layout_notificacion_colapsada.xml y layout_notificacion_expandida.xml deben crearse según los requisitos de diseño.
- Notificaciones de Pantalla Completa (Colgantes)
Las notificaciones que ocupan toda la pantalla al recibirse, conocidas como "colgantes" o de pantalla completa, se configuran mediente el método setFullScreenIntent en lugar de setContentIntent.
// ... (dentro del método del builder) ...
Intent intencionPantallaCompleta = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.ejemplo.com/emergencia"));
PendingIntent intencionPendientePantallaCompleta = PendingIntent.getActivity(this, 1, intencionPantallaCompleta, PendingIntent.FLAG_IMMUTABLE);
constructorNotificacion.setFullScreenIntent(intencionPendientePantallaCompleta, true);
Niveles de Importancia del Canal (NotificationChannel.importance):
IMPORTANCE_NONE: No muestra la notificación.IMPORTANCE_MIN: Muestra en la barra de estado, sin sonido ni interrupción.IMPORTANCE_LOW: Muestra en la barra de estado, sin sonido.IMPORTANCE_DEFAULT: Muestra en la barra de estado con sonido, sin interrupción.IMPORTANCE_HIGH: Muestra como una notificación emergente (interrumpe al usuario) con sonido.
Nota de Depuración: Si una notificación de pantalla completa no aparece, verifique la configuración de notificaciones del dispositivo. Es posible que la categoría de notificación no esté configurada para mostrar "banners" o notificaciones emergentes.
- Visibilidad de Notificaciones en la Pantalla de Bloqueo
Android permite controlar qué información se muestra en la pantalla de bloqueo utilizando diferentes niveles de visibilidad:
Notification.VISIBILITY_PRIVATE: Muestra información básica (título, ícono) solo si el dispositivo no está bloqueado.Notification.VISIBILITY_PUBLIC: Muestra toda la información de la notificación, independientemente del estado de bloqueo.Notification.VISIBILITY_SECRET: No muestra nada de la notificación en la pantalla de bloqueo.
Se configuran directamente en el Notification.Builder:
// Ejemplo para hacerla pública en pantalla de bloqueo
constructorNotificacion.setVisibility(Notification.VISIBILITY_PUBLIC);
Para más detalles sobre la gestión de notificaciones, consulte la documentación oficial o recursos como esta referencia.