AlarmManager: Temel kavramlar ve alarmlarla çalışma

Yazar: IT Sectr Yayınlanma: 2026-03-28 Okuma süresi: 8 dk

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, uyku modunda bile çalışan, hassas zamanlarda görevleri yürütmek için bir Android sistem servisidir.
  • Alarm türleri, ELAPSED_REALTIME, RTC, ELAPSED_REALTIME_WAKEUP ve RTC_WAKEUP'ı içerir — uyandırmalı ve uyandırmasız.
  • setExact, Android 4.4+'ta hassas tetiklemeyi garanti eder ancak daha fazla pil tüketir.
  • setAlarmClock, sistemin Android 6+'da zamanında yürütmeyi garanti ettiği tek yöntemdir.
  • Android 12'den itibaren, hassas alarmlar için SCHEDULE_EXACT_ALARM izni gerekir.

AlarmManager nedir?

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 nasıl çalışır?

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.

Alarm türleri

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ürZamanUyandırırÖrnek
ELAPSED_REALTIMEbaşlatmadan itibarenhayırçalışma süresi sayacı
RTCUnix zaman damgasıhayırgünlükleme
ELAPSED_REALTIME_WAKEUPbaşlatmadan itibarenevetperiyodik görev
RTC_WAKEUPUnix zaman damgasıevetçalar saat

İzinler ve haklar

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.

set, setRepeating ve setExact yöntemleri

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.

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

AlarmManager kullanım örneği

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.

kotlin
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.

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

Optimizasyon ve öneriler

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.

Birim testlerde AlarmManager'ı test etme

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.

AlarmManager'dan WorkManager'a geçiş

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.

Alarmları geri yüklemek için BOOT_COMPLETED işleme

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.

kotlin
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

setExact ve setAlarmClock arasındaki fark nedir?

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.

AlarmManager cihaz yeniden başlatıldıktan sonra nasıl davranır?

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.

Android 4.4+'ta setRepeating neden önerilmez?

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.

Android 12+'da hassas alarmlar için hangi izin gereklidir?

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.

AlarmManager PendingIntent olmadan kullanılabilir mi?

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

  • AlarmManager, cihaz uyandırma yeteneğiyle hassas zamanlarda görevleri yürütmek için bir Android sistem servisidir.
  • Dört tür alarm — ELAPSED_REALTIME, RTC, ELAPSED_REALTIME_WAKEUP ve RTC_WAKEUP — farklı senaryoları kapsar.
  • setExact ve setAlarmClock, modern Android sürümlerinde hassas tetikleme için tek yöntemlerdir.
  • setRepeating Android 4.4+'ta kullanımdan kaldırılmıştır — manuel yeniden planlamayla setExact kullanın.
  • SCHEDULE_EXACT_ALARM izni Android 12+'da hassas alarmlar için zorunludur.
  • WorkManager veya JobScheduler, zaman gereksinimi olmayan hassas olmayan arka plan görevleri için tercih edilir.
  • Unutmayın cihaz yeniden başlatıldıktan sonra alarmları geri yüklemek için BOOT_COMPLETED'i işlemeyi.

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.

Projeyi tartış

Ayrıca okuyun