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 — 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 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.
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.
| Tur | Vaqt | Uyg'otadi | Misol |
|---|---|---|---|
| ELAPSED_REALTIME | yuklanishdan | yo'q | ish vaqti taymeri |
| RTC | Unix timestamp | yo'q | loglash |
| ELAPSED_REALTIME_WAKEUP | yuklanishdan | ha | davriy vazifa |
| RTC_WAKEUP | Unix timestamp | ha | signal |
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.
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.
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
)
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.
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.
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 — 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 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.
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.
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.
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
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.
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.
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.
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.
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
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.