AlarmManager — ay isang serbisyo ng system ng Android na nagpapahintulot sa mga application na magsagawa ng mga gawain sa isang nakatakdang oras, kahit na ang application ay hindi tumatakbo o ang device ay nasa sleep mode. Hindi tulad ng JobScheduler o WorkManager, ginagarantiyahan ng AlarmManager ang tumpak na pag-trigger, na ginagawang kailangang-kailangan ito para sa mga alarm, paalala sa kalendaryo at mga gawaing kritikal sa oras. Ayon sa Android Developers, 2026, simula sa Android 4.4 ang setRepeating ay kumikilos bilang hindi tumpak na pag-uulit, at para sa mga tumpak na alarm ay kinakailangan ang setExact o setAlarmClock.
Mga Pangunahing Punto
AlarmManager — ay isang serbisyo ng system ng Android na nagbibigay ng API para sa pag-iskedyul ng mga gawain na may tumpak o tinatayang oras ng pagpapatupad. Ito ay umiiral mula noong unang bersyon ng Android at nananatiling tanging maaasahang paraan upang maisagawa ang code sa isang tiyak na sandali, anuman ang estado ng application at device.
Ang prinsipyo ng pagpapatakbo ay simple: ang application ay nagpapadala sa system ng isang PendingIntent na may tinukoy na oras ng pag-trigger. Kapag dumating ang nais na sandali, ang system ay nagpapadala ng Intent sa nakarehistrong BroadcastReceiver o naglulunsad ng Service. Kahit na ang device ay nasa sleep mode, pinapayagan ng WakeLock ang processor na magising at iproseso ang kaganapan.
Ang pangunahing lugar ng aplikasyon ng AlarmManager — mga gawain na nangangailangan ng tumpak na oras: mga alarm, paalala sa kalendaryo, pagsisimula ng mahabang operasyon sa isang tiyak na oras. Para sa mga gawain kung saan ang katumpakan ay hindi kritikal (pag-sync isang beses sa isang araw), inirerekomenda ng Google ang WorkManager o JobScheduler dahil mas matipid sila sa enerhiya.
AlarmManager ay tumatanggap mula sa application ng PendingIntent at oras ng pag-trigger. Iniimbak ng system ang kahilingang ito sa panloob na scheduler nito at ginigising ang processor sa tinukoy na oras upang maihatid ang Intent. Dapat magrehistro nang maaga ang developer ng BroadcastReceiver na magpoproseso ng Intent na ito.
AlarmManager ay sumusuporta sa 4 na uri ng alarm: ELAPSED_REALTIME (oras mula sa boot, hindi ginigising), RTC (tunay na oras, hindi ginigising), ELAPSED_REALTIME_WAKEUP (oras mula sa boot, ginigising ang device) at RTC_WAKEUP (tunay na oras, ginigising). Ang mga bersyon ng WAKEUP ay kinakailangan kung ang gawain ay dapat isagawa kahit na natutulog ang device.
| Uri | Oras | Gumigising | Halimbawa |
|---|---|---|---|
| ELAPSED_REALTIME | mula sa boot | hindi | timer ng oras ng trabaho |
| RTC | Unix timestamp | hindi | pag-log |
| ELAPSED_REALTIME_WAKEUP | mula sa boot | oo | pana-panahong gawain |
| RTC_WAKEUP | Unix timestamp | oo | alarm |
Simula sa Android 12 (API 31), para sa paggamit ng mga tumpak na alarm (setExact) ay kinakailangan ang pahintulot na SCHEDULE_EXACT_ALARM. Maaari itong bawiin ng user sa mga setting. Para sa mga application na nangangailangan ng tumpak na alarm na may display (halimbawa, orasan), ginagamit ang USE_EXACT_ALARM, na ibinibigay sa pag-install.
AlarmManager ay nagbibigay ng tatlong pangunahing paraan para sa pag-iskedyul ng mga gawain. Ang pagpili ng paraan ay tumutukoy sa katumpakan ng pag-trigger at epekto sa paggamit ng kuryente ng device.
set — ang pangunahing paraan para sa isang beses na hindi tumpak na pag-trigger. Maaaring ilipat ng system ang oras ng ilang minuto para sa pagpapangkat sa iba pang mga kaganapan. Angkop para sa mga gawain kung saan hindi kritikal ang katumpakan: paalala na pumasok sa application.
setRepeating — ang paraan para sa pana-panahong pag-uulit. Simula sa Android 4.4 (API 19) ang setRepeating ay naging hindi tumpak — ang mga interval ay maaaring mag-iba. Hindi na ginagarantiyahan ng system ang isang pare-parehong panahon. Sa halip na setRepeating, inirerekomenda ang paggamit ng setExact na may manu-manong pag-reschedule o WorkManager na may PeriodicWorkRequest.
setExact — ang paraan para sa isang beses na tumpak na pag-trigger. Ginigising ng system ang device sa oras na pinakamalapit sa tinukoy. setAlarmClock — isang espesyal na kaso ng setExact, na nagpapakita rin ng icon ng alarm sa status bar at may pinakamataas na priyoridad sa lahat ng uri ng alarm.
val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager
// Tumpak na isang beses na 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
)
Karaniwang senaryo — paggawa ng pang-araw-araw na paalala sa isang tiyak na oras. Para dito ginagamit ang RTC_WAKEUP na may setExact. Kapag na-trigger, ang BroadcastReceiver ay naglulunsad ng notification o Service. Pagkatapos ng pagproseso, ang gawain ay dapat na i-reschedule para sa susunod na araw.
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("Paalala")
.setContentText("Oras na upang isagawa ang gawain")
.setSmallIcon(R.drawable.ic_reminder)
.build()
notificationManager.notify(1001, notification)
}
}
Para sa araw-araw na pag-uulit ay ginagamit ang setExact na may pagkalkula ng susunod na pag-trigger. Sa Intent ay maaaring ipadala ang mga flag para sa pagkilala ng iba't ibang uri ng paalala. Tiyaking ang BroadcastReceiver ay nakarehistro sa AndroidManifest.xml na may pagproseso ng action na WAKEUP.
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 — isang makapangyarihan ngunit masiglang tool. Bawat WAKEUP alarm ay naglalabas ng device mula sa sleep mode, na kumokonsumo ng baterya. Inirerekomenda ng Google na bawasan ang paggamit ng mga tumpak na alarm at mas piliin ang setExactAndAllowWhileIdle sa Android 6+ upang bawasan ang epekto sa Doze Mode. Para sa mga pana-panahong gawain na walang kinakailangang katumpakan, gamitin ang WorkManager na may PeriodicWorkRequest, na hindi nangangailangan ng paggising ng device at hindi kumokonsumo ng baterya sa bawat pagpapatupad.
Para sa pagsubok ng AlarmManager gamitin ang TestAlarmManager mula sa Android Test Framework. Pinapayagan nito ang pagtulad sa pag-trigger ng alarm nang hindi naghihintay ng totoong oras. Sa Robolectric ay available ang ShadowAlarmManager, na humaharang sa mga tawag sa set, setExact at setRepeating, na nagbibigay ng mga paraan para sa sapilitang pag-trigger at pagsusuri ng bilang ng mga naka-iskedyul na gawain. Para sa mga unit test ng BroadcastReceiver gamitin ang Robolectric.getForegroundScheduler(). Gayundin ay available ang Espresso test na may IdlingResource na naghihintay ng pag-trigger ng alarm sa mga integration test.
Kung ang application ay gumagamit ng AlarmManager para sa mga pana-panahong gawain na hindi nangangailangan ng tumpak na oras, isaalang-alang ang paglipat sa WorkManager. Ang PeriodicWorkRequest na may minimum na interval na 15 minuto ay pumapalit sa setRepeating, habang ginagarantiyahan ng WorkManager ang pagpapatupad pagkatapos ng restart, pinangangasiwaan ang Doze Mode, at hindi nangangailangan ng pahintulot na SCHEDULE_EXACT_ALARM. Para sa mga gawaing kritikal sa oras (alarm sa 7 ng umaga), ang AlarmManager ay nananatiling tanging tamang pagpipilian. Ang pinakamainam na estratehiya — gamitin ang AlarmManager lamang para sa mga alarm na may setAlarmClock, at ilipat ang lahat ng iba pang background na gawain sa WorkManager.
Para sa mga pana-panahong gawain na walang kinakailangang katumpakan gamitin ang WorkManager na may PeriodicWorkRequest. Para sa mga gawain na may tumpak na oras ngunit hindi kritikal para sa pag-trigger sa sleep mode — setExact na walang WAKEUP. At para lamang sa mga alarm na may sapilitang paggising — setAlarmClock o RTC_WAKEUP.
Mahalaga ring suriin ang pagkakaroon ng pahintulot na SCHEDULE_EXACT_ALARM sa Android 12+. Kung ang pahintulot ay hindi ibinigay, ang setExact ay gagana tulad ng regular na set (hindi tumpak). Gamitin ang AlarmManager.canScheduleExactAlarms() para suriin. Kung walang pahintulot, maaari mong imungkahi sa user na pumunta sa mga setting sa pamamagitan ng Intent(Settings.ACTION_REQUEST_SCHEDULE_EXACT_ALARM).
Isang kritikal na mahalagang tampok ng AlarmManager — lahat ng naka-iskedyul na alarm ay nire-reset pagkatapos i-restart ang device. Para sa kanilang pagpapanumbalik, kailangan mong magdeklara ng BroadcastReceiver na nagpoproseso ng Intent.ACTION_BOOT_COMPLETED at i-reschedule ang lahat ng aktibong alarm sa paraang onReceive. Kung wala ito, mawawala sa user ang lahat ng paalala pagkatapos patayin at buksan ang telepono.
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)
}
}
}
}
Sa praktika, ang AlarmManager ay nananatiling pinakamahusay na solusyon para sa mga application ng alarm, kalendaryo, paalala sa pag-inom ng gamot at anumang gawain kung saan ang oras ng pag-trigger ay kritikal para sa user. Para sa lahat ng iba pang senaryo ng background na trabaho, ang WorkManager o JobScheduler ay mas mainam.
Kapag pumipili sa pagitan ng AlarmManager at WorkManager, sundin ang patakaran: kung ang user ay tahasang humingi ng paalala sa 14:30 — gamitin ang AlarmManager na may setAlarmClock. Kung ang gawain ay dapat isagawa "humigit-kumulang isang beses bawat oras" — ang WorkManager na may PeriodicWorkRequest ay magiging mas matipid sa enerhiya at mas maaasahan.
Mga Madalas Itanong
Ang parehong paraan ay ginagarantiyahan ang tumpak na pag-trigger, ngunit ang setAlarmClock ay nagpapakita rin ng icon ng alarm sa status bar at nagpapaalam sa system na ito ay isang alarm para sa user. Sa Android 6+, ang setAlarmClock ay may immunity mula sa Doze Mode, habang ang setExact ay maaaring maantala.
Pagkatapos ng restart, lahat ng naka-iskedyul na alarm ay nire-reset. Para sa pagpapanumbalik, kailangan mong magrehistro ng BroadcastReceiver para sa action na BOOT_COMPLETED at i-reschedule ang lahat ng gawain sa onReceive. Kung wala ito, walang alarm ang gagana pagkatapos i-on ang device.
Simula sa API 19, ang setRepeating ay naging hindi tumpak — maaaring ilipat ng system ang mga interval upang makatipid ng enerhiya. Sa halip nito, gamitin ang setExact na may manu-manong pag-reschedule o WorkManager na may PeriodicWorkRequest na nagbibigay ng mas predictable na pag-uugali.
Para sa setExact ay kinakailangan ang pahintulot na SCHEDULE_EXACT_ALARM, na maaaring ibigay o bawiin ng user sa mga setting. Para sa setAlarmClock na may display sa interface ng orasan, ginagamit ang USE_EXACT_ALARM, na awtomatikong ibinibigay sa pag-install mula sa tindahan.
Hindi, ang AlarmManager ay palaging gumagana sa pamamagitan ng PendingIntent. Ito ay maaaring PendingIntent.getBroadcast para sa BroadcastReceiver, PendingIntent.getService para sa Service o PendingIntent.getActivity para sa Activity. Kung walang PendingIntent, hindi maihahatid ng system ang kaganapan sa application.
Buod
Gagawa kami ng mobile application na turnkey
Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.
Basahin din