Apps Kit SDK logoApps Kit SDK
Documentação · Integração com Android

9. Notificações locais (AppsKitSDKLocalNotificationManager)

O AKS inclui um pequeno conjunto de ferramentas para notificações locais — uma fila, um construtor de notificações e um BroadcastReceiver abstrato — que você pode usar para exibir suas próprias notificações locais. O AKS não registra o receiver no próprio manifesto nem faz agendamentos para você; essas duas tarefas ficam por sua conta.

9.1 Manifesto

Crie uma subclasse de AppsKitSDKLocalNotificationBroadCastReceiver (mostrada na §9.2) e declare-a como um <receiver>, dentro do mesmo elemento <application> da §2:

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

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

</application>

Se o app tiver como alvo o Android 13+ (API 33), adicione também a permissão de notificações em tempo de execução — o manifesto do próprio AKS não a declara, portanto ela não será incluída automaticamente na mesclagem dos manifestos:

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

POST_NOTIFICATIONS é uma permissão em tempo de execução, então você ainda precisa solicitá-la ao usuário (por exemplo, via ActivityResultContracts.RequestPermission()) para que as notificações sejam efetivamente exibidas.

9.2 Adicionando uma notificação à fila

Crie uma subclasse de AppsKitSDKLocalNotificationBroadCastReceiver e implemente checkNotifications() — o ponto de extensão em que você decide se é hora de exibir uma notificação, chamado sempre que o receiver é acionado:

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

Assim que checkNotifications() retorna, onReceive chama automaticamente AppsKitSDKLocalNotificationManager.showNotification(context) — esse método remove da fila o NotificationModel mais antigo e o exibe. Nesse fluxo, você não precisa chamar showNotification diretamente; basta adicionar a notificação à fila dentro de checkNotifications().

Esse fluxo de exibição via fila verifica POST_NOTIFICATIONS por conta própria no Android 13+ e ignora silenciosamente a exibição (registrando uma linha de log) se a permissão não tiver sido concedida. Portanto, solicite-a antes, conforme a §9.1.

9.3 Agendamento

O AKS não registra nem aciona esse receiver em intervalos agendados — você decide quando onReceive é acionado, geralmente usando 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, você pode definir um intervalo fixo no código ou usar o valor definido na configuração remota do portal do AKS (HOURS_TO_MAKE_NOTIFICATION, cujo padrão é 2 horas quando não definido). Esse valor é disponibilizado por getTimeIntervalInMilliSeconds() na classe base do receiver, mas o método é protected. Por isso, chame-o de dentro da sua subclasse, e não no trecho de chamada acima:

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

AlarmManager.setRepeating não é exato sob o efeito do Doze ou das otimizações de bateria — se você precisar de acionamentos confiáveis enquanto o dispositivo estiver ocioso, reagende com setExactAndAllowWhileIdle a cada acionamento ou use PeriodicWorkRequest do WorkManager (intervalo mínimo de 15 minutos). O AKS não exige nenhuma dessas opções; escolha a mais adequada ao seu app. Observe também que os alarmes não são mantidos após a reinicialização do dispositivo, a menos que você os registre novamente (por exemplo, em um receiver de BOOT_COMPLETED).

9.4 Exibindo uma notificação diretamente (sem fila)

Para exibir uma notificação imediatamente, sem passar pelo fluxo de fila/receiver acima:

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 as sobrecargas criam o canal de notificação para você, caso ele ainda não exista. Ao contrário do fluxo via fila da §9.2, nenhuma delas verifica POST_NOTIFICATIONS por conta própria — solicite a permissão em tempo de execução no Android 13+, ou a chamada poderá falhar silenciosamente e não exibir a notificação.