AlarmManager: mahahalagang konsepto at pagtatrabaho sa mga alarm

May-akda: IT Sectr Nai-publish: 2026-03-28 Oras ng pagbabasa: 8 min

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 para sa pagsasagawa ng mga gawain sa eksaktong oras, na gumagana kahit sa sleep mode.
  • Mga uri ng alarm ay kinabibilangan ng ELAPSED_REALTIME, RTC, ELAPSED_REALTIME_WAKEUP at RTC_WAKEUP — may paggising at walang.
  • setExact ay ginagarantiyahan ang tumpak na pag-trigger sa Android 4.4+, ngunit kumokonsumo ng mas maraming baterya.
  • setAlarmClock — ang tanging paraan na garantisadong maisasagawa ng system sa tamang oras sa Android 6+.
  • Simula sa Android 12 para sa mga tumpak na alarm ay kinakailangan ang pahintulot na SCHEDULE_EXACT_ALARM.

Ano ang AlarmManager?

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.

Paano gumagana ang AlarmManager?

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.

Mga uri ng alarm

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.

UriOrasGumigisingHalimbawa
ELAPSED_REALTIMEmula sa boothinditimer ng oras ng trabaho
RTCUnix timestamphindipag-log
ELAPSED_REALTIME_WAKEUPmula sa bootoopana-panahong gawain
RTC_WAKEUPUnix timestampooalarm

Mga pahintulot at karapatan

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.

Mga paraan set, setRepeating at setExact

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.

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

Halimbawa ng paggamit ng AlarmManager

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.

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("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.

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

Pag-optimize at mga rekomendasyon

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.

Pagsubok sa AlarmManager sa mga unit test

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.

Paglipat mula sa AlarmManager patungong WorkManager

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

Pangangasiwa ng BOOT_COMPLETED para sa pagpapanumbalik ng mga 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.

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

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

Ano ang pagkakaiba sa pagitan ng setExact at setAlarmClock?

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.

Paano kumikilos ang AlarmManager pagkatapos i-restart ang device?

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.

Bakit hindi inirerekomenda ang setRepeating sa Android 4.4+?

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.

Anong pahintulot ang kailangan para sa mga tumpak na alarm sa Android 12+?

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.

Maaari bang gamitin ang AlarmManager nang walang PendingIntent?

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

  • AlarmManager — serbisyo ng system ng Android para sa pagsasagawa ng mga gawain sa eksaktong oras na may kakayahang gisingin ang device.
  • Apat na uri ng alarm — ELAPSED_REALTIME, RTC, ELAPSED_REALTIME_WAKEUP at RTC_WAKEUP — sumasaklaw sa iba't ibang senaryo.
  • setExact at setAlarmClock — ang tanging mga paraan para sa tumpak na pag-trigger sa mga modernong bersyon ng Android.
  • setRepeating ay luma na sa Android 4.4+ — gamitin ang setExact na may manu-manong pag-reschedule.
  • Pahintulot na SCHEDULE_EXACT_ALARM ay sapilitan sa Android 12+ para sa mga tumpak na alarm.
  • WorkManager o JobScheduler ay mas mainam para sa mga hindi tumpak na background na gawain na walang kinakailangang oras.
  • Huwag kalimutan na pangasiwaan ang BOOT_COMPLETED para sa pagpapanumbalik ng mga alarm pagkatapos i-restart ang device.

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.

Pag-usapan ang proyekto

Basahin din