Notificaciones en Android Studio: Guía Completa, Canales y Permiso POST_NOTIFICATIONS

🏠 Curso Android Gratis > Lección 11 de 18
Módulo 4 · Nivel Práctico

Las notificaciones en Android son uno de los canales de comunicación e interacción más potentes que tiene una aplicación con sus usuarios. Nos permiten enviar alertas visuales, avisos de tareas en segundo plano, mensajes de chat o recordatorios directos a la barra de estado y al panel de notificaciones del dispositivo.

crear notificaciones android studio
⚠️ Importante para Android 13 (API 33) y versiones posteriores: A partir de Android 13, las notificaciones ya no se muestran por defecto: es obligatorio solicitar el permiso en tiempo de ejecución POST_NOTIFICATIONS al usuario antes de disparar cualquier notificación.

Anatomía de una notificación en Android

anatomia notificacion android

Al desplegar el panel de notificaciones, el sistema muestra una estructura estandarizada compuesta por los siguientes elementos:

  1. Small Icon: Icono monocromático obligatorio que se muestra en la barra de estado superior.
  2. App Name: Nombre de la aplicación proporcionado por el sistema.
  3. Timestamp: Marca de tiempo que indica cuándo se disparó la alerta.
  4. Large Icon: Gráfico o avatar opcional situado a la derecha.
  5. Title (setContentTitle): Título principal en negrita de la notificación.
  6. Text (setContentText): Mensaje o descripción explicativa del evento.

Paso 1: Declarar y Solicitar el Permiso POST_NOTIFICATIONS (Android 13+)

En tu archivo AndroidManifest.xml, añade:

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
    ...
</manifest>

Y en tu Activity, solicítalo con la moderna Activity Result API de AndroidX:

val requestPermissionLauncher = registerForActivityResult(
    ActivityResultContracts.RequestPermission()
) { isGranted: Boolean ->
    if (isGranted) {
        // Permiso concedido: puedes lanzar notificaciones
    } else {
        // Permiso denegado por el usuario
    }
}

// Comprobación de versión antes de solicitar
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) 
        != PackageManager.PERMISSION_GRANTED) {
        requestPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS)
    }
}

Paso 2: Crear el Canal de Notificaciones (NotificationChannel)

Desde Android 8.0 (API 26), toda notificación debe pertenecer obligatoriamente a un NotificationChannel. Esto permite al usuario personalizar en los ajustes del teléfono qué tipo de avisos quiere recibir (sonido, vibración, silenciadas):

private val CHANNEL_ID = "canal_alertas_principales"

private fun createNotificationChannel() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        val name = "Alertas Principales"
        val descriptionText = "Notificaciones de aviso y tareas del sistema"
        val importance = NotificationManager.IMPORTANCE_HIGH
        val channel = NotificationChannel(CHANNEL_ID, name, importance).apply {
            description = descriptionText
            enableVibration(true)
        }
        val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
        notificationManager.createNotificationChannel(channel)
    }
}

Paso 3: Construir y Lanzar la Notificación

Utilizamos NotificationCompat.Builder de la librería AndroidX para garantizar compatibilidad total con todas las versiones del sistema operativo:

fun showNotification(context: Context, titulo: String, mensaje: String) {
    val intent = Intent(context, MainActivity::class.java).apply {
        flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
    }
    val pendingIntent = PendingIntent.getActivity(
        context, 0, intent,
        PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
    )

    val builder = NotificationCompat.Builder(context, CHANNEL_ID)
        .setSmallIcon(R.drawable.ic_notification)
        .setContentTitle(titulo)
        .setContentText(mensaje)
        .setPriority(NotificationCompat.PRIORITY_HIGH)
        .setContentIntent(pendingIntent)
        .setAutoCancel(true)

    with(NotificationManagerCompat.from(context)) {
        if (ActivityCompat.checkSelfPermission(context, Manifest.permission.POST_NOTIFICATIONS) 
            == PackageManager.PERMISSION_GRANTED) {
            notify(1001, builder.build())
        }
    }
}

Puedes inspeccionar el código fuente completo del proyecto de ejemplo en mi repositorio de GitHub: AlarmNotificationSample.

Notificaciones Push con Firebase Cloud Messaging (FCM)

Si deseas enviar notificaciones de forma remota a miles de dispositivos simultáneamente (por ejemplo, para alertar sobre nuevas ofertas, publicaciones o actualizaciones), el servicio por excelencia es Firebase Cloud Messaging (FCM). En este vídeo de YouTube de mi curso práctico te explico cómo configurarlo paso a paso:

Víctor Alonso - Desarrollador Android Senior

Creado y tutorizado por Víctor Alonso

Ingeniero en Informática · Desarrollador Android Senior & Fundador de Walkiria Apps

Especialista en desarrollo nativo para Android (Kotlin, Jetpack Compose, Arquitectura MVVM/Clean) con apps en Google Play que superan cientos de miles de descargas. Formador y divulgador técnico.

Deja un comentario