Apps Kit SDK logoApps Kit SDK
Documentación · Integración en Android

9. Notificaciones locales (AppsKitSDKLocalNotificationManager)

AKS incluye un pequeño conjunto de herramientas para notificaciones locales —una cola, un constructor de notificaciones y un BroadcastReceiver abstracto— que puedes usar para mostrar tus propias notificaciones locales. AKS no registra el receptor en su manifiesto ni programa nada por ti; ambas tareas corren por tu cuenta.

9.1 Manifiesto

Crea una subclase de AppsKitSDKLocalNotificationBroadCastReceiver (como se muestra en §9.2) y declárala como un <receiver> dentro del mismo elemento <application> de §2:

xml
<application
    android:name=".YourApplication">

    <receiver
        android:name=".YourNotificationReceiver"
        android:exported="false" />

</application>

Si tu aplicación está orientada a Android 13+ (API 33), añade también el permiso de notificaciones que se solicita en tiempo de ejecución. El manifiesto de AKS no lo declara, por lo que no se incorporará automáticamente al combinar los manifiestos:

xml
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />

POST_NOTIFICATIONS es un permiso que se solicita en tiempo de ejecución, así que debes pedírselo al usuario (por ejemplo, mediante ActivityResultContracts.RequestPermission()) antes de que se puedan publicar las notificaciones.

9.2 Añadir una notificación a la cola

Crea una subclase de AppsKitSDKLocalNotificationBroadCastReceiver e implementa checkNotifications(): es el método que te permite decidir si corresponde mostrar una notificación y se invoca cada vez que se activa el receptor:

kotlin
class YourNotificationReceiver : AppsKitSDKLocalNotificationBroadCastReceiver() {

    override fun checkNotifications() {
        addNotificationInQueue(
            NotificationModel(
                id = "daily_reminder",                      // dedup key — a second add with the same id is ignored
                title = "Come back!",
                description = "You have unfinished items waiting.",
                icon = R.drawable.ic_notification,
                notificationId = 1001,                       // the actual Android notification ID passed to notify()
                targetScreen = "com.yourapp.MainActivity"    // fully-qualified Activity class opened on tap
            )
        )
    }
}

Justo después de que termine checkNotifications(), onReceive llama automáticamente a AppsKitSDKLocalNotificationManager.showNotification(context): extrae el NotificationModel más antiguo de la cola y lo muestra. En este flujo no tienes que llamar a showNotification; basta con añadir la notificación a la cola dentro de checkNotifications().

Este flujo de visualización desde la cola comprueba por sí mismo POST_NOTIFICATIONS en Android 13+ y, si no se ha concedido, omite la notificación sin avisar al usuario (aunque deja una entrada en el registro). Por tanto, asegúrate de haber solicitado el permiso antes, según se indica en §9.1.

9.3 Programación

AKS no registra este receptor ni lo activa de forma programada: tú decides cuándo se ejecuta onReceive, normalmente mediante AlarmManager:

kotlin
val intent = Intent(context, YourNotificationReceiver::class.java)
val pendingIntent = PendingIntent.getBroadcast(
    context, 0, intent, PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
)

val alarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
alarmManager.setRepeating(
    AlarmManager.RTC_WAKEUP,
    System.currentTimeMillis() + intervalMs,
    intervalMs,
    pendingIntent
)

Para intervalMs, puedes fijar tu propio intervalo en el código o usar el valor de la configuración remota del portal de AKS (HOURS_TO_MAKE_NOTIFICATION, cuyo valor predeterminado es de 2 horas si no se configura). Ese valor está disponible mediante getTimeIntervalInMilliSeconds() en la clase base del receptor, pero el método es protected, así que debes llamarlo desde tu subclase y no desde el código anterior:

kotlin
class YourNotificationReceiver : AppsKitSDKLocalNotificationBroadCastReceiver() {
    fun intervalMillis(): Long = getTimeIntervalInMilliSeconds()
    override fun checkNotifications() { /* ... */ }
}

AlarmManager.setRepeating no es exacto cuando se aplican Doze o las optimizaciones de batería. Si necesitas que se active de forma fiable mientras el dispositivo está inactivo, vuelve a programarlo con setExactAndAllowWhileIdle en cada activación, o usa PeriodicWorkRequest de WorkManager (con un intervalo mínimo de 15 minutos). AKS no exige ninguna de estas opciones; elige la que mejor se adapte a tu aplicación. Ten en cuenta también que las alarmas no se conservan tras reiniciar el dispositivo, a menos que vuelvas a registrarlas por tu cuenta (por ejemplo, desde un receptor de BOOT_COMPLETED).

9.4 Mostrar una notificación directamente (sin cola)

Para publicar una notificación de inmediato, sin pasar por el flujo de cola y receptor descrito anteriormente:

kotlin
// Tapping opens the Activity at classPath
AppsKitSDKLocalNotificationManager.showNotification(
    context = this,
    id = 2001,
    classPath = "com.yourapp.MainActivity",
    channelId = "general",
    title = "New message",
    message = "You've got a new message waiting.",
    notificationIcon = R.drawable.ic_notification
)

// Or pass a fully-built Intent instead of a class path
AppsKitSDKLocalNotificationManager.showNotification(
    context = this,
    id = 2002,
    intent = Intent(this, MainActivity::class.java).putExtra("from", "notification"),
    channelId = "general",
    title = "New message",
    message = "Tap to view details.",
    notificationIcon = R.drawable.ic_notification
)

Ambas sobrecargas crean el canal de notificaciones por ti si aún no existe. A diferencia del flujo con cola de §9.2, ninguna comprueba POST_NOTIFICATIONS por sí misma: solicita el permiso en tiempo de ejecución en Android 13+; de lo contrario, es posible que la llamada no publique la notificación ni indique el fallo.