AlarmManager: asosiy tushunchalar va signallar bilan ishlash

Muallif: IT Sectr Nashr etilgan: 2026-03-28 O'qish vaqti: 8 daq

AlarmManager — bu ilovalarga belgilangan vaqtda vazifalarni bajarish imkonini beruvchi Android tizim xizmati, hatto ilova ishga tushirilmagan yoki qurilma uyqu rejimida bo'lsa ham. JobScheduler yoki WorkManager-dan farqli o'laroq, AlarmManager aniq ishga tushishni kafolatlaydi, bu esa uni signallar, kalendar eslatmalari va vaqt jihatidan muhim vazifalar uchun ajralmas qiladi. Android Developers, 2026 ma'lumotiga ko'ra, Android 4.4 dan boshlab setRepeating noaniq takrorlash sifatida ishlaydi va aniq signallar uchun setExact yoki setAlarmClock talab qilinadi.

Asosiy fikrlar

  • AlarmManager — Android-da aniq vaqtda vazifalarni bajarish uchun tizim xizmati, uyqu rejimida ham ishlaydi.
  • Signal turlari ELAPSED_REALTIME, RTC, ELAPSED_REALTIME_WAKEUP va RTC_WAKEUP — uyg'otish bilan va uyg'otmasdan.
  • setExact Android 4.4+ da aniq ishga tushishni kafolatlaydi, lekin ko'proq batareya sarflaydi.
  • setAlarmClock — Android 6+ da tizim o'z vaqtida bajarilishini kafolatlaydigan yagona usul.
  • Android 12 dan boshlab aniq signallar uchun SCHEDULE_EXACT_ALARM ruxsati talab qilinadi.

AlarmManager nima?

AlarmManager — aniq yoki taxminiy bajarish vaqti bilan vazifalarni rejalashtirish uchun API taqdim etuvchi Android tizim xizmatidir. Android-ning birinchi versiyasidan mavjud bo'lib, ilova va qurilma holatidan qat'i nazar, belgilangan vaqtda kodni bajarishning yagona ishonchli usuli bo'lib qolmoqda.

Ishlash printsipi oddiy: ilova tizimga ishga tushish vaqtini ko'rsatgan holda PendingIntent yuboradi. Kerakli payt kelganda, tizim ro'yxatdan o'tgan BroadcastReceiver ga Intent yuboradi yoki Service-ni ishga tushiradi. Qurilma uyqu rejimida bo'lsa ham, WakeLock protsessorning uyg'onishi va hodisani qayta ishlashiga imkon beradi.

AlarmManager ning asosiy qo'llanish sohasi — aniq vaqt talab qiladigan vazifalar: signallar, kalendar eslatmalari, ma'lum bir soatda uzoq muddatli operatsiyalarni boshlash. Aniqlik muhim bo'lmagan vazifalar uchun (kuniga bir marta sinxronlash) Google WorkManager yoki JobScheduler ni tavsiya qiladi, chunki ular energiya jihatidan samaraliroq.

AlarmManager qanday ishlaydi?

AlarmManager ilovadan PendingIntent va ishga tushish vaqtini oladi. Tizim bu so'rovni o'z ichki rejalashtiruvchisida saqlaydi va Intent-ni yetkazish uchun belgilangan vaqtda protsessorni uyg'otadi. Dasturchi ushbu Intent-ni qayta ishlaydigan BroadcastReceiver-ni oldindan ro'yxatdan o'tkazishi kerak.

Signal turlari

AlarmManager 4 turdagi signalni qo'llab-quvvatlaydi: ELAPSED_REALTIME (yuklanishdan vaqt, uyg'otmaydi), RTC (real vaqt, uyg'otmaydi), ELAPSED_REALTIME_WAKEUP (yuklanishdan vaqt, qurilmani uyg'otadi) va RTC_WAKEUP (real vaqt, uyg'otadi). WAKEUP versiyalari vazifa qurilma uxlayotganda ham bajarilishi kerak bo'lganda zarur.

TurVaqtUyg'otadiMisol
ELAPSED_REALTIMEyuklanishdanyo'qish vaqti taymeri
RTCUnix timestampyo'qloglash
ELAPSED_REALTIME_WAKEUPyuklanishdanhadavriy vazifa
RTC_WAKEUPUnix timestamphasignal

Ruxsatlar va huquqlar

Android 12 (API 31) dan boshlab, aniq signallardan (setExact) foydalanish uchun SCHEDULE_EXACT_ALARM ruxsati talab qilinadi. Foydalanuvchi uni sozlamalardan qaytarib olishi mumkin. Ko'rsatiladigan aniq signal talab qiladigan ilovalar uchun (masalan, soat) o'rnatish vaqtida beriladigan USE_EXACT_ALARM ishlatiladi.

set, setRepeating va setExact usullari

AlarmManager vazifalarni rejalashtirish uchun uchta asosiy usulni taqdim etadi. Usul tanlovi ishga tushish aniqligini va qurilmaning energiya sarfiga ta'sirini belgilaydi.

set — bir martalik noaniq ishga tushish uchun asosiy usul. Tizim boshqa hodisalar bilan guruhlash uchun vaqtni bir necha daqiqaga o'zgartirishi mumkin. Aniqlik muhim bo'lmagan vazifalar uchun mos keladi: ilovaga kirishni eslatish.

setRepeating — davriy takrorlashlar uchun usul. Android 4.4 (API 19) dan boshlab setRepeating noaniq bo'ldi — intervallar o'zgarishi mumkin. Tizim endi doimiy davrni kafolatlamaydi. setRepeating o'rniga qo'lda qayta rejalashtirish bilan setExact yoki PeriodicWorkRequest bilan WorkManager dan foydalanish tavsiya etiladi.

setExact — aniq bir martalik ishga tushish uchun usul. Tizim qurilmani belgilangan vaqtga imkon qadar yaqin uyg'otadi. setAlarmClock — setExact ning maxsus holati, u status panelida signal belgisini ko'rsatadi va barcha signal turlari orasida eng yuqori ustuvorlikka ega.

kotlin
val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager

// Aniq bir martalik signal
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 dan foydalanish misoli

Odatiy stsenariy — ma'lum bir vaqtda kunlik eslatma yaratish. Buning uchun RTC_WAKEUP setExact bilan ishlatiladi. Ishga tushganda, BroadcastReceiver bildirishnoma yoki Service-ni ishga tushiradi. Qayta ishlashdan so'ng, vazifani keyingi kunga qayta rejalashtirish kerak.

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("Eslatma")
            .setContentText("Vazifani bajarish vaqti keldi")
            .setSmallIcon(R.drawable.ic_reminder)
            .build()

        notificationManager.notify(1001, notification)
    }
}

Har kuni takrorlash uchun setExact keyingi ishga tushishni hisoblash bilan ishlatiladi. Intent-da turli xil eslatma turlarini aniqlash uchun flaglar uzatilishi mumkin. BroadcastReceiver AndroidManifest.xml da WAKEUP harakatini qayta ishlash bilan ro'yxatdan o'tganligiga ishonch hosil qiling.

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

Optimallashtirish va tavsiyalar

AlarmManager — kuchli, ammo energiya talab qiladigan vosita. Har bir WAKEUP signali qurilmani uyqu rejimidan chiqaradi, bu batareyani sarflaydi. Google aniq signallardan foydalanishni minimallashtirishni va Doze Mode ga ta'sirni kamaytirish uchun Android 6+ da setExactAndAllowWhileIdle ni afzal ko'rishni tavsiya qiladi. Aniqlik talab qilmaydigan davriy vazifalar uchun PeriodicWorkRequest bilan WorkManager dan foydalaning, u qurilmani uyg'otishni talab qilmaydi va har bir ishga tushirishda batareya sarflamaydi.

AlarmManager ni birlik testlarida sinash

AlarmManager ni sinash uchun Android Test Framework dan TestAlarmManager dan foydalaning. U real vaqtni kutmasdan signalning ishga tushishini simulyatsiya qilish imkonini beradi. Robolectric da set, setExact va setRepeating chaqiruvlarini tutib oladigan ShadowAlarmManager mavjud bo'lib, majburiy ishga tushirish va rejalashtirilgan vazifalar sonini tekshirish usullarini taqdim etadi. BroadcastReceiver ning birlik testlari uchun Robolectric.getForegroundScheduler() dan foydalaning. Integratsiya testlarida signalning ishga tushishini kutadigan IdlingResource bilan Espresso testi ham mavjud.

AlarmManager dan WorkManager ga migratsiya

Agar ilova aniq vaqt talab qilmaydigan davriy vazifalar uchun AlarmManager dan foydalansa, WorkManager ga migratsiyani ko'rib chiqing. Minimal intervali 15 daqiqa bo'lgan PeriodicWorkRequest setRepeating ni almashtiradi, WorkManager qayta ishga tushirishdan keyin bajarilishni kafolatlaydi, Doze Mode ni boshqaradi va SCHEDULE_EXACT_ALARM ruxsatini talab qilmaydi. Vaqt jihatidan muhim vazifalar uchun (ertalab soat 7 da signal) AlarmManager yagona to'g'ri tanlov bo'lib qoladi. Optimal strategiya — AlarmManager ni faqat setAlarmClock bilan signallar uchun ishlatish, barcha boshqa fon vazifalarini WorkManager ga o'tkazish.

Aniqlik talab qilmaydigan davriy vazifalar uchun WorkManager ni PeriodicWorkRequest bilan ishlating. Aniq vaqt talab qiladigan, lekin uyqu rejimida ishga tushishi muhim bo'lmagan vazifalar uchun — WAKEUP siz setExact. Va faqat majburiy uyg'otish bilan signallar uchun — setAlarmClock yoki RTC_WAKEUP.

Shuningdek, Android 12+ da SCHEDULE_EXACT_ALARM ruxsati mavjudligini tekshirish muhim. Ruxsat berilmagan bo'lsa, setExact oddiy set kabi ishlaydi (noaniq). Tekshirish uchun AlarmManager.canScheduleExactAlarms() dan foydalaning. Ruxsat bo'lmaganda, foydalanuvchiga Intent(Settings.ACTION_REQUEST_SCHEDULE_EXACT_ALARM) orqali sozlamalarga o'tishni taklif qilishingiz mumkin.

Signallarni tiklash uchun BOOT_COMPLETED ni qayta ishlash

AlarmManager ning muhim xususiyati — barcha rejalashtirilgan signallar qurilma qayta ishga tushirilgandan so'ng tiklanadi. Ularni tiklash uchun Intent.ACTION_BOOT_COMPLETED ni qayta ishlaydigan BroadcastReceiver e'lon qilish va onReceive metodida barcha faol signallarni qayta rejalashtirish kerak. Busiz foydalanuvchi telefonni o'chirib yoqqandan so'ng barcha eslatmalarini yo'qotadi.

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

Amalda AlarmManager signal ilovalari, kalendarlar, dori qabul qilish eslatmalari va foydalanuvchi uchun ishga tushish vaqti muhim bo'lgan har qanday vazifalar uchun eng yaxshi yechim bo'lib qolmoqda. Boshqa barcha fon ish stsenariylari uchun WorkManager yoki JobScheduler afzalroqdir.

AlarmManager va WorkManager o'rtasida tanlov qilishda qoidaga amal qiling: agar foydalanuvchi aniq soat 14:30 da eslatma so'ragan bo'lsa — setAlarmClock bilan AlarmManager dan foydalaning. Agar vazifa „taxminan soatda bir marta" bajarilishi kerak bo'lsa — PeriodicWorkRequest bilan WorkManager energiya jihatidan samaraliroq va ishonchliroq bo'ladi.

Ko'p so'raladigan savollar

setExact va setAlarmClock o'rtasidagi farq nima?

Ikkala usul ham aniq ishga tushishni kafolatlaydi, lekin setAlarmClock qo'shimcha ravishda status panelida signal belgisini ko'rsatadi va tizimga bu foydalanuvchi uchun signal ekanligini bildiradi. Android 6+ da setAlarmClock Doze Mode dan immunitetga ega, setExact esa kechiktirilishi mumkin.

AlarmManager qurilma qayta ishga tushirilgandan keyin qanday ishlaydi?

Qayta ishga tushirishdan so'ng barcha rejalashtirilgan signallar tiklanadi. Tiklash uchun BOOT_COMPLETED harakati uchun BroadcastReceiver ni ro'yxatdan o'tkazish va onReceive da barcha vazifalarni qayta rejalashtirish kerak. Busiz qurilma yoqilgandan keyin hech qanday signal ishlamaydi.

Nega setRepeating Android 4.4+ da tavsiya etilmaydi?

API 19 dan boshlab setRepeating noaniq bo'ldi — tizim energiya tejash uchun intervallarni o'zgartirishi mumkin. Buning o'rniga qo'lda qayta rejalashtirish bilan setExact yoki bashorat qilinadigan xatti-harakatni ta'minlaydigan PeriodicWorkRequest bilan WorkManager dan foydalaning.

Android 12+ da aniq signallar uchun qanday ruxsat kerak?

setExact uchun foydalanuvchi sozlamalarda berishi yoki qaytarib olishi mumkin bo'lgan SCHEDULE_EXACT_ALARM ruxsati talab qilinadi. Soat interfeysida ko'rsatiladigan setAlarmClock uchun do'kondan o'rnatish vaqtida avtomatik beriladigan USE_EXACT_ALARM ishlatiladi.

AlarmManager PendingIntent siz ishlatilishi mumkinmi?

Yo'q, AlarmManager har doim PendingIntent orqali ishlaydi. Bu BroadcastReceiver uchun PendingIntent.getBroadcast, Service uchun PendingIntent.getService yoki Activity uchun PendingIntent.getActivity bo'lishi mumkin. PendingIntent siz tizim hodisani ilovaga yetkaza olmaydi.

Xulosa

  • AlarmManager — qurilmani uyg'otish imkoniyati bilan aniq vaqtda vazifalarni bajarish uchun Android tizim xizmati.
  • To'rt tur signal — ELAPSED_REALTIME, RTC, ELAPSED_REALTIME_WAKEUP va RTC_WAKEUP — turli stsenariylarni qamrab oladi.
  • setExact va setAlarmClock — zamonaviy Android versiyalarida aniq ishga tushish uchun yagona usullar.
  • setRepeating Android 4.4+ da eskirgan — qo'lda qayta rejalashtirish bilan setExact dan foydalaning.
  • SCHEDULE_EXACT_ALARM ruxsati Android 12+ da aniq signallar uchun majburiydir.
  • WorkManager yoki JobScheduler vaqt talabi bo'lmagan noaniq fon vazifalari uchun afzalroqdir.
  • Unutmang qurilma qayta ishga tushirilgandan keyin signallarni tiklash uchun BOOT_COMPLETED ni qayta ishlang.

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing