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; bunların ikisi de sizin sorumluluğunuzdadır.
9.1 Manifest
AppsKitSDKLocalNotificationBroadCastReceiver sınıfından bir alt sınıf türetin (§9.2 bölümünde gösterilmiştir) ve bu alt sınıfı, §2 bölümündeki aynı <application> öğesine birleştirilecek şekilde bir <receiver> olarak tanımlayın:
<application
android:name=".YourApplication">
<receiver
android:name=".YourNotificationReceiver"
android:exported="false" />
</application>Android 13+ (API 33) hedefliyorsanız çalışma zamanı bildirim iznini de ekleyin. AKS'nin kendi manifest dosyasında bu izin tanımlı değildir, dolayısıyla manifest birleştirme işlemiyle otomatik olarak eklenmez:
<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 (ör. ActivityResultContracts.RequestPermission() aracılığıyla).
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, bir bildirimin gösterilme zamanının gelip gelmediğine karar verirsiniz:
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öner dönmez onReceive, otomatik olarak AppsKitSDKLocalNotificationManager.showNotification(context) metodunu çağırır. Bu metot, kuyruğa ilk eklenen NotificationModel öğesini kuyruktan çıkarır ve bildirimi 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+ sürümlerinde
POST_NOTIFICATIONSiznini kendisi kontrol eder. İzin verilmemişse bir günlük satırı yazarak bildirimi 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 tetikleneceğine siz karar verirsiniz; bunun için genellikle AlarmManager kullanılır:
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 uzak yapılandırmada ayarlanan değeri kullanabilirsiniz (HOURS_TO_MAKE_NOTIFICATION; ayarlanmamışsa varsayılan değer 2 saattir). Bu değere, temel alıcı sınıfındaki getTimeIntervalInMilliSeconds() metodu üzerinden erişilebilir. 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:
class YourNotificationReceiver : AppsKitSDKLocalNotificationBroadCastReceiver() {
fun intervalMillis(): Long = getTimeIntervalInMilliSeconds()
override fun checkNotifications() { /* ... */ }
}
AlarmManager.setRepeating, Doze/pil optimizasyonları altında kesin zamanlamayla çalışmaz. Cihaz boştayken güvenilir biçimde tetiklenmesi gerekiyorsa bunun yerine her tetiklenmedesetExactAndAllowWhileIdleile yeniden zamanlayın veyaWorkManageriçindekiPeriodicWorkRequestkullanımına geçin (minimum aralık 15 dakikadır). AKS bu seçeneklerden herhangi birini zorunlu tutmaz; uygulamanıza uygun olanı seçin. Ayrıca, alarmları kendiniz yeniden kaydetmediğiniz sürece (ör. birBOOT_COMPLETEDalıcısından) cihaz yeniden başlatıldığında alarmların korunmadığını unutmayın.
9.4 Bildirimi doğrudan gösterme (kuyruk olmadan)
Yukarıdaki kuyruk/alıcı akışını kullanmadan bir bildirimi hemen göstermek için:
// 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
)Metodun her iki aşırı yüklenmiş sürümü de bildirim kanalı henüz mevcut değilse kanalı sizin için oluşturur. §9.2 bölümündeki kuyruk akışının aksine, bu sürümlerin hiçbiri POST_NOTIFICATIONS iznini kendisi kontrol etmez. Android 13+ sürümlerinde çalışma zamanı iznini kendiniz isteyin; aksi takdirde çağrı sessizce başarısız olabilir ve bildirim gösterilmeyebilir.