Apps Kit SDK logoApps Kit SDK
Dokümantasyon · Android Entegrasyonu

9. Yerel bildirimler (AppsKitSDKLocalNotificationManager)

AKS, kendi yerel bildirimlerinizi göstermek için kullanabileceğiniz küçük bir araç seti sunar: bir kuyruk, bir bildirim oluşturucu ve soyut bir BroadcastReceiver. AKS, alıcıyı kendi manifest dosyasına kaydetmez ve sizin için herhangi bir zamanlama yapmaz; her ikisi de sizin sorumluluğunuzdadır.

9.1 Manifest

AppsKitSDKLocalNotificationBroadCastReceiver sınıfından türettiğiniz alt sınıfı (§9.2 bölümünde gösterilmiştir), §2 bölümündeki aynı <application> öğesine birleştirilecek şekilde <receiver> olarak tanımlayın:

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

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

</application>

Android 13 ve üzerini (API 33) hedefliyorsanız çalışma zamanı bildirim iznini de ekleyin. AKS'nin kendi manifest dosyası bu izni tanımlamadığından, izin otomatik olarak birleştirilmez:

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

POST_NOTIFICATIONS bir çalışma zamanı iznidir. Bu nedenle bildirimlerin gerçekten gösterilebilmesi için kullanıcıdan bu izni istemeniz gerekir (örneğin ActivityResultContracts.RequestPermission() ile).

9.2 Bildirimi kuyruğa ekleme

AppsKitSDKLocalNotificationBroadCastReceiver sınıfından bir alt sınıf türetin ve checkNotifications() metodunu uygulayın. Alıcı her tetiklendiğinde çağrılan bu metotta, bildirim zamanının gelip gelmediğine karar verirsiniz:

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

checkNotifications() döndükten hemen sonra onReceive, otomatik olarak AppsKitSDKLocalNotificationManager.showNotification(context) metodunu çağırır. Bu metot, kuyruktaki en eski NotificationModel öğesini kuyruktan çıkarıp gösterir. Bu akışta showNotification metodunu kendiniz çağırmazsınız; checkNotifications() içinde kuyruğa eklemeniz yeterlidir.

Bu kuyruktan gösterim akışı, Android 13 ve üzerinde POST_NOTIFICATIONS iznini kendisi kontrol eder. İzin verilmemişse bir günlük satırı yazarak gösterimi sessizce atlar. Bu nedenle önce §9.1 bölümünde belirtildiği gibi izni istediğinizden emin olun.

9.3 Zamanlama

AKS, bu alıcıyı herhangi bir zamanlamaya göre kaydetmez veya tetiklemez. onReceive metodunun ne zaman çalışacağını, genellikle AlarmManager kullanarak siz belirlersiniz:

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
)

intervalMs için kendi aralığınızı kodda sabit olarak belirleyebilir veya AKS portalındaki uzaktan yapılandırmada ayarlanan değeri kullanabilirsiniz (HOURS_TO_MAKE_NOTIFICATION; ayarlanmadıysa varsayılan değer 2 saattir). Bu değere temel alıcı sınıfındaki getTimeIntervalInMilliSeconds() metodu üzerinden erişilir. Ancak metot protected olduğundan, yukarıdaki çağrı noktasından değil, alt sınıfınızın içinden çağırın:

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

AlarmManager.setRepeating, Doze/pil optimizasyonları altında kesin zamanlamayla çalışmaz. Cihaz boşta olduğunda güvenilir şekilde tetiklenmesi gerekiyorsa her tetiklemede setExactAndAllowWhileIdle ile yeniden zamanlayın veya WorkManager tarafından sunulan PeriodicWorkRequest yapısına geçin (minimum aralık 15 dakikadır). AKS bunlardan birini zorunlu tutmaz; uygulamanıza uygun olanı seçin. Ayrıca, alarmları kendiniz yeniden kaydetmediğiniz sürece (örneğin bir BOOT_COMPLETED alıcısından) cihaz yeniden başlatıldığında alarmların korunmadığını unutmayın.

9.4 Doğrudan bildirim gösterme (kuyruksuz)

Yukarıdaki kuyruk/alıcı akışını kullanmadan hemen bir bildirim göstermek için:

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
)

Her iki aşırı yükleme de bildirim kanalı henüz yoksa sizin için oluşturur. §9.2 bölümündeki kuyruk akışının aksine, hiçbiri POST_NOTIFICATIONS iznini kendisi kontrol etmez. Android 13 ve üzerinde çalışma zamanı iznini kendiniz isteyin; aksi takdirde çağrı sessizce başarısız olabilir ve bildirim gösterilmeyebilir.