AlarmManager, uygulamaların belirtilen bir zamanda, uygulama çalışmıyor olsa veya cihaz uyku modunda olsa bile görevleri yürütmesine izin veren bir Android sistem servisidir. JobScheduler veya WorkManager'ın aksine, AlarmManager tetikleme doğruluğunu garanti eder ve bu da onu alarmlar, takvim hatırlatıcıları ve zaman açısından kritik görevler için vazgeçilmez kılar. Android Developers, 2026'ya göre, Android 4.4'ten itibaren setRepeating, hassas olmayan bir tekrarlama gibi davranır ve hassas alarmlar için setExact veya setAlarmClock gerekir.
Önemli noktalar
AlarmManager, hassas veya yaklaşık yürütme süresiyle görevleri planlamak için API sağlayan bir Android sistem servisidir. Android'in ilk sürümünden beri var olup, uygulama ve cihaz durumundan bağımsız olarak belirtilen bir zamanda kod yürütmenin tek güvenilir yoludur.
Çalışma prensibi basittir: uygulama, sisteme planlanan tetikleme zamanıyla birlikte bir PendingIntent gönderir. Belirtilen zaman geldiğinde, sistem kayıtlı bir BroadcastReceiver'a Intent gönderir veya bir Service başlatır. Cihaz uyku modunda olsa bile, WakeLock işlemcinin uyanmasını ve olayı işlemesini sağlar.
AlarmManager'ın ana uygulama alanı, hassas zamanlama gerektiren görevlerdir: alarmlar, takvim hatırlatıcıları, belirli bir saatte uzun süreli işlemleri başlatma. Hassasiyetin kritik olmadığı görevler için (günlük senkronizasyon), Google daha enerji verimli oldukları için WorkManager veya JobScheduler'ı önerir.
AlarmManager, uygulamadan bir PendingIntent ve tetikleme zamanı alır. Sistem bu isteği dahili zamanlayıcısında saklar ve Intent'i iletmek için belirtilen zamanda işlemciyi uyandırır. Geliştiricinin bu Intent'i işlemek için önceden bir BroadcastReceiver kaydetmesi gerekir.
AlarmManager 4 alarm türünü destekler: ELAPSED_REALTIME (başlatmadan bu yana geçen süre, uyandırmaz), RTC (gerçek zaman, uyandırmaz), ELAPSED_REALTIME_WAKEUP (başlatmadan bu yana geçen süre, cihazı uyandırır) ve RTC_WAKEUP (gerçek zaman, uyandırır). WAKEUP sürümleri, görevin cihaz uyurken bile yürütülmesi gerekiyorsa gereklidir.
| Tür | Zaman | Uyandırır | Örnek |
|---|---|---|---|
| ELAPSED_REALTIME | başlatmadan itibaren | hayır | çalışma süresi sayacı |
| RTC | Unix zaman damgası | hayır | günlükleme |
| ELAPSED_REALTIME_WAKEUP | başlatmadan itibaren | evet | periyodik görev |
| RTC_WAKEUP | Unix zaman damgası | evet | çalar saat |
Android 12'den (API 31) itibaren, hassas alarmlar (setExact) kullanmak için SCHEDULE_EXACT_ALARM izni gerekir. Kullanıcı bunu ayarlar üzerinden iptal edebilir. Görüntülü hassas alarm gerektiren uygulamalar için (örneğin, saat uygulamaları), kurulum sırasında verilen USE_EXACT_ALARM kullanılır.
AlarmManager, görevleri planlamak için üç ana yöntem sağlar. Yöntem seçimi, tetikleme doğruluğunu ve cihazın güç tüketimi üzerindeki etkiyi belirler.
set — tek seferlik hassas olmayan tetikleme için temel yöntemdir. Sistem, diğer olaylarla gruplamak için zamanı birkaç dakikaya kadar kaydırabilir. Hassasiyetin kritik olmadığı görevler için uygundur: uygulamayı açma hatırlatıcıları.
setRepeating — periyodik tekrarlamalar için bir yöntemdir. Android 4.4'ten (API 19) itibaren setRepeating hassas olmayan hale geldi — aralıklar değişebilir. Sistem artık sabit bir periyodu garanti etmez. setRepeating yerine, yeniden planlamayla setExact veya PeriodicWorkRequest ile WorkManager kullanılması önerilir.
setExact — hassas tek seferlik tetikleme için bir yöntemdir. Sistem, cihazı belirtilen zamana mümkün olduğunca yakın uyandırır. setAlarmClock, setExact'in özel bir durumudur ve ayrıca durum çubuğunda bir alarm simgesi gösterir ve tüm alarm türleri arasında en yüksek önceliğe sahiptir.
val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager
// Hassas tek seferlik alarm
val intent = Intent(this, AlarmReceiver::class.java)
val pendingIntent = PendingIntent.getBroadcast(
this, 0, intent,
PendingIntent.FLAG_IMMUTABLE
)
alarmManager.setAlarmClock(
AlarmManager.AlarmClockInfo(
targetTime, pendingIntent
),
pendingIntent
)
Tipik bir senaryo, belirli bir zamanda günlük bir hatırlatıcı oluşturmaktır. Bu amaçla setExact ile RTC_WAKEUP kullanılır. Tetiklendiğinde, BroadcastReceiver bir bildirim veya Service başlatır. İşlemeden sonra, görev bir sonraki gün için yeniden planlanmalıdır.
class ReminderReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent?) {
val notificationManager =
context.getSystemService(Context.NOTIFICATION_SERVICE)
as NotificationManager
val notification = NotificationCompat.Builder(
context, "reminder_channel"
)
.setContentTitle("Hatırlatıcı")
.setContentText("Görevi tamamlama zamanı")
.setSmallIcon(R.drawable.ic_reminder)
.build()
notificationManager.notify(1001, notification)
}
}
Günlük tekrarlama için, sonraki tetikleme zamanının hesaplanmasıyla setExact kullanılır. Farklı hatırlatıcı türlerini tanımlamak için Intent'te bayraklar iletilebilir. BroadcastReceiver'ın WAKEUP eylem işlemesiyle AndroidManifest.xml'de kayıtlı olduğundan emin olun.
fun scheduleDailyReminder(context: Context, hour: Int, minute: Int) {
val calendar = Calendar.getInstance().apply {
set(Calendar.HOUR_OF_DAY, hour)
set(Calendar.MINUTE, minute)
set(Calendar.SECOND, 0)
if (before(Calendar.getInstance())) {
add(Calendar.DAY_OF_MONTH, 1)
}
}
val alarmManager =
context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
alarmManager.setExactAndAllowWhileIdle(
AlarmManager.RTC_WAKEUP,
calendar.timeInMillis,
pendingIntent
)
}
AlarmManager güçlü ancak çok enerji tüketen bir araçtır. Her WAKEUP alarmı cihazı uyku modundan çıkarır ve pil tüketir. Google, hassas alarmların kullanımını en aza indirmeyi ve Doze Mode üzerindeki etkiyi azaltmak için Android 6+'da setExactAndAllowWhileIdle'ı tercih etmeyi önerir. Hassasiyet gereksinimi olmayan periyodik görevler için, cihazı uyandırmayı gerektirmeyen ve her yürütmede pili tüketmeyen PeriodicWorkRequest ile WorkManager kullanın.
AlarmManager'ı test etmek için Android Test Framework'ten TestAlarmManager'ı kullanın. Gerçek zamanı beklemeden alarm tetiklemelerini simüle etmeye olanak tanır. Robolectric, set, setExact ve setRepeating çağrılarını kesen ShadowAlarmManager sağlayarak zorlamalı tetikleme ve planlanan görev sayısını kontrol etme yöntemleri sunar. BroadcastReceiver birim testleri için Robolectric.getForegroundScheduler() kullanın. Entegrasyon testlerinde alarm tetiklemesini bekleyen IdlingResource ile Espresso testleri de mevcuttur.
Uygulamanız hassas zamanlama gerektirmeyen periyodik görevler için AlarmManager kullanıyorsa, WorkManager'a geçmeyi düşünün. Minimum 15 dakika aralıklı PeriodicWorkRequest, setRepeating'in yerini alırken, WorkManager yeniden başlatmadan sonra yürütmeyi garanti eder, Doze Mode'u işler ve SCHEDULE_EXACT_ALARM izni gerektirmez. Zamana duyarlı görevler için (sabah 7'de alarm), AlarmManager tek doğru seçim olmaya devam eder. En uygun strateji, AlarmManager'ı yalnızca setAlarmClock ile alarmlar için kullanmak ve diğer tüm arka plan görevlerini WorkManager'a taşımaktır.
Hassasiyet gereksinimi olmayan periyodik görevler için, PeriodicWorkRequest ile WorkManager kullanın. Hassas zamanlamalı ancak uyku modunda tetiklenmesi kritik olmayan görevler için — WAKEUP olmadan setExact kullanın. Ve yalnızca zorunlu uyandırmalı alarmlar için — setAlarmClock veya RTC_WAKEUP kullanın.
Android 12+'da SCHEDULE_EXACT_ALARM iznini kontrol etmek de önemlidir. İzin verilmezse, setExact normal set (hassas olmayan) gibi çalışır. Kontrol etmek için AlarmManager.canScheduleExactAlarms() kullanın. İzin yoksa, Intent(Settings.ACTION_REQUEST_SCHEDULE_EXACT_ALARM) aracılığıyla kullanıcıyı ayarlara gitmeye yönlendirebilirsiniz.
AlarmManager'ın kritik bir özelliği — cihaz yeniden başlatıldıktan sonra planlanan tüm alarmlar sıfırlanır. Bunları geri yüklemek için, Intent.ACTION_BOOT_COMPLETED'i işleyen bir BroadcastReceiver bildirmeniz ve onReceive yönteminde tüm etkin alarmları yeniden planlamanız gerekir. Bu olmadan, kullanıcı telefonu kapatıp açtıktan sonra tüm hatırlatıcıları kaybeder.
class BootReceiver : BroadcastReceiver() {
override fun onReceive(
context: Context,
intent: Intent
) {
if (intent.action ==
Intent.ACTION_BOOT_COMPLETED
) {
val prefs =
context.getSharedPreferences("alarms", 0)
val savedTime =
prefs.getLong("next_alarm", 0L)
if (savedTime > System.currentTimeMillis()) {
scheduleReminder(context, savedTime)
}
}
}
}
Pratikte, AlarmManager çalar saat uygulamaları, takvimler, ilaç hatırlatıcıları ve yürütme süresinin kullanıcı için kritik olduğu herhangi bir görev için en iyi çözüm olmaya devam etmektedir. Diğer tüm arka plan çalışma senaryoları için WorkManager veya JobScheduler tercih edilir.
AlarmManager ve WorkManager arasında seçim yaparken şu kuralı izleyin: kullanıcı açıkça saat 14:30'da hatırlatma istediyse — setAlarmClock ile AlarmManager kullanın. Görev “yaklaşık saatte bir” yürütülecekse — PeriodicWorkRequest ile WorkManager daha enerji verimli ve güvenilir olacaktır.
Sık sorulan sorular
Her iki yöntem de hassas tetiklemeyi garanti eder, ancak setAlarmClock ayrıca durum çubuğunda bir alarm simgesi gösterir ve sisteme bunun bir kullanıcı alarmı olduğunu bildirir. Android 6+'da setAlarmClock, Doze Mode'a karşı bağışıklığa sahipken, setExact geciktirilebilir.
Yeniden başlatmadan sonra, planlanan tüm alarmlar sıfırlanır. Bunları geri yüklemek için, BOOT_COMPLETED eylemi için bir BroadcastReceiver kaydetmeli ve onReceive'de tüm görevleri yeniden planlamalısınız. Bu olmadan, cihaz açıldıktan sonra hiçbir alarm tetiklenmez.
API 19'dan itibaren, setRepeating hassas olmayan hale geldi — sistem güç tasarrufu için aralıkları kaydırabilir. Bunun yerine, manuel yeniden planlamayla setExact veya daha öngörülebilir davranış sağlayan PeriodicWorkRequest ile WorkManager kullanın.
setExact için, kullanıcının ayarlarda verebileceği veya iptal edebileceği SCHEDULE_EXACT_ALARM izni gerekir. Saat arayüzü görüntülemeli setAlarmClock için, mağazadan kurulumda otomatik olarak verilen USE_EXACT_ALARM kullanılır.
Hayır, AlarmManager her zaman PendingIntent aracılığıyla çalışır. Bu, BroadcastReceiver için PendingIntent.getBroadcast, Service için PendingIntent.getService veya Activity için PendingIntent.getActivity olabilir. PendingIntent olmadan, sistem olayı uygulamaya iletemez.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun