AlarmManager: konsep kunci dan bekerja dengan alarm

Penulis: IT Sectr Diterbitkan: 2026-03-28 Waktu membaca: 8 mnt

AlarmManager — adalah layanan sistem Android yang memungkinkan aplikasi menjalankan tugas pada waktu yang ditentukan, meskipun aplikasi tidak sedang berjalan atau perangkat dalam mode tidur. Tidak seperti JobScheduler atau WorkManager, AlarmManager menjamin ketepatan pemicuan, menjadikannya sangat diperlukan untuk alarm, pengingat kalender, dan tugas yang kritis terhadap waktu. Menurut Android Developers, 2026, mulai Android 4.4 setRepeating berperilaku sebagai pengulangan tidak akurat, dan untuk alarm yang akurat diperlukan setExact atau setAlarmClock.

Poin Utama

  • AlarmManager — adalah layanan sistem Android untuk menjalankan tugas pada waktu yang tepat, bekerja bahkan dalam mode tidur.
  • Jenis alarm mencakup ELAPSED_REALTIME, RTC, ELAPSED_REALTIME_WAKEUP, dan RTC_WAKEUP — dengan dan tanpa membangunkan.
  • setExact menjamin pemicuan tepat pada Android 4.4+, tetapi menghabiskan lebih banyak baterai.
  • setAlarmClock — satu-satunya metode yang sistem jamin dijalankan tepat waktu pada Android 6+.
  • Mulai Android 12 untuk alarm yang akurat diperlukan izin SCHEDULE_EXACT_ALARM.

Apa itu AlarmManager?

AlarmManager — adalah layanan sistem Android yang menyediakan API untuk menjadwalkan tugas dengan waktu eksekusi yang tepat atau perkiraan. Telah ada sejak versi pertama Android dan tetap menjadi satu-satunya cara yang andal untuk mengeksekusi kode pada waktu tertentu, terlepas dari status aplikasi dan perangkat.

Prinsip kerjanya sederhana: aplikasi mengirimkan PendingIntent ke sistem dengan menentukan waktu pemicuan. Ketika waktu yang diinginkan tiba, sistem mengirimkan Intent ke BroadcastReceiver yang terdaftar atau memulai Service. Bahkan jika perangkat dalam mode tidur, WakeLock memungkinkan prosesor terbangun dan memproses kejadian.

Bidang aplikasi utama AlarmManager — tugas yang memerlukan waktu yang tepat: alarm, pengingat kalender, memulai operasi panjang pada jam tertentu. Untuk tugas yang ketepatannya tidak kritis (sinkronisasi sekali sehari), Google merekomendasikan WorkManager atau JobScheduler karena lebih hemat energi.

Bagaimana cara kerja AlarmManager?

AlarmManager menerima dari aplikasi PendingIntent dan waktu pemicuan. Sistem menyimpan permintaan ini dalam penjadwal internalnya dan membangunkan prosesor pada waktu yang ditentukan untuk mengirimkan Intent. Pengembang harus mendaftarkan BroadcastReceiver terlebih dahulu yang akan memproses Intent ini.

Jenis alarm

AlarmManager mendukung 4 jenis alarm: ELAPSED_REALTIME (waktu sejak boot, tidak membangunkan), RTC (waktu nyata, tidak membangunkan), ELAPSED_REALTIME_WAKEUP (waktu sejak boot, membangunkan perangkat), dan RTC_WAKEUP (waktu nyata, membangunkan). Versi WAKEUP diperlukan jika tugas harus dijalankan bahkan saat perangkat tidur.

JenisWaktuBangunContoh
ELAPSED_REALTIMEsejak boottidaktimer waktu kerja
RTCUnix timestamptidakpencatatan log
ELAPSED_REALTIME_WAKEUPsejak bootyatugas periodik
RTC_WAKEUPUnix timestampyaalarm

Izin dan hak

Mulai Android 12 (API 31), untuk menggunakan alarm yang akurat (setExact) diperlukan izin SCHEDULE_EXACT_ALARM. Pengguna dapat mencabutnya melalui pengaturan. Untuk aplikasi yang memerlukan alarm akurat dengan tampilan (misalnya jam), digunakan USE_EXACT_ALARM, yang diberikan saat pemasangan.

Metode set, setRepeating, dan setExact

AlarmManager menyediakan tiga metode utama untuk menjadwalkan tugas. Pemilihan metode menentukan ketepatan pemicuan dan dampak pada konsumsi daya perangkat.

set — metode dasar untuk pemicuan tunggal yang tidak akurat. Sistem dapat menggeser waktu hingga beberapa menit untuk pengelompokan dengan peristiwa lain. Cocok untuk tugas yang ketepatannya tidak kritis: pengingat untuk masuk ke aplikasi.

setRepeating — metode untuk pengulangan periodik. Mulai Android 4.4 (API 19) setRepeating menjadi tidak akurat — interval dapat bervariasi. Sistem tidak lagi menjamin periode yang konstan. Sebagai pengganti setRepeating, disarankan menggunakan setExact dengan penjadwalan ulang manual atau WorkManager dengan PeriodicWorkRequest.

setExact — metode untuk pemicuan tunggal yang akurat. Sistem membangunkan perangkat sedekat mungkin dengan waktu yang ditentukan. setAlarmClock — kasus khusus setExact, yang juga menampilkan ikon alarm di bilah status dan memiliki prioritas tertinggi di antara semua jenis alarm.

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

// Alarm tunggal yang akurat
val intent = Intent(this, AlarmReceiver::class.java)
val pendingIntent = PendingIntent.getBroadcast(
    this, 0, intent,
    PendingIntent.FLAG_IMMUTABLE
)

alarmManager.setAlarmClock(
    AlarmManager.AlarmClockInfo(
        targetTime, pendingIntent
    ),
    pendingIntent
)

Contoh penggunaan AlarmManager

Skenario tipikal — membuat pengingat harian pada waktu tertentu. Untuk ini digunakan RTC_WAKEUP dengan setExact. Saat dipicu, BroadcastReceiver memulai notifikasi atau Service. Setelah diproses, tugas harus dijadwalkan ulang untuk hari berikutnya.

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("Pengingat")
            .setContentText("Waktunya menjalankan tugas")
            .setSmallIcon(R.drawable.ic_reminder)
            .build()

        notificationManager.notify(1001, notification)
    }
}

Untuk pengulangan harian digunakan setExact dengan perhitungan pemicuan berikutnya. Dalam Intent dapat dikirimkan flag untuk identifikasi berbagai jenis pengingat. Pastikan BroadcastReceiver terdaftar di AndroidManifest.xml dengan penanganan action 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
    )
}

Optimasi dan rekomendasi

AlarmManager — alat yang kuat tetapi boros energi. Setiap alarm WAKEUP mengeluarkan perangkat dari mode tidur, yang menghabiskan baterai. Google merekomendasikan untuk meminimalkan penggunaan alarm yang akurat dan lebih memilih setExactAndAllowWhileIdle pada Android 6+ untuk mengurangi dampak pada Doze Mode. Untuk tugas periodik tanpa persyaratan ketepatan, gunakan WorkManager dengan PeriodicWorkRequest, yang tidak memerlukan membangunkan perangkat dan tidak menghabiskan baterai pada setiap eksekusi.

Menguji AlarmManager dalam pengujian unit

Untuk menguji AlarmManager gunakan TestAlarmManager dari Android Test Framework. Ini memungkinkan simulasi pemicuan alarm tanpa menunggu waktu nyata. Di Robolectric tersedia ShadowAlarmManager, yang mencegat panggilan set, setExact, dan setRepeating, menyediakan metode untuk pemicuan paksa dan memeriksa jumlah tugas yang dijadwalkan. Untuk pengujian unit BroadcastReceiver gunakan Robolectric.getForegroundScheduler(). Juga tersedia pengujian Espresso dengan IdlingResource yang menunggu pemicuan alarm dalam pengujian integrasi.

Migrasi dari AlarmManager ke WorkManager

Jika aplikasi menggunakan AlarmManager untuk tugas periodik yang tidak memerlukan waktu akurat, pertimbangkan migrasi ke WorkManager. PeriodicWorkRequest dengan interval minimal 15 menit menggantikan setRepeating, sementara WorkManager menjamin eksekusi setelah restart, menangani Doze Mode, dan tidak memerlukan izin SCHEDULE_EXACT_ALARM. Untuk tugas yang kritis terhadap waktu (alarm jam 7 pagi), AlarmManager tetap menjadi pilihan yang tepat. Strategi optimal — gunakan AlarmManager hanya untuk alarm dengan setAlarmClock, dan pindahkan semua tugas latar lainnya ke WorkManager.

Untuk tugas periodik tanpa persyaratan ketepatan gunakan WorkManager dengan PeriodicWorkRequest. Untuk tugas dengan waktu yang tepat tetapi tidak kritis untuk pemicuan dalam mode tidur — setExact tanpa WAKEUP. Dan hanya untuk alarm dengan kebangkitan wajib — setAlarmClock atau RTC_WAKEUP.

Juga penting untuk memeriksa keberadaan izin SCHEDULE_EXACT_ALARM pada Android 12+. Jika izin tidak diberikan, setExact akan berfungsi seperti set biasa (tidak akurat). Gunakan AlarmManager.canScheduleExactAlarms() untuk memeriksa. Jika izin tidak ada, Anda dapat menyarankan pengguna untuk pergi ke pengaturan melalui Intent(Settings.ACTION_REQUEST_SCHEDULE_EXACT_ALARM).

Menangani BOOT_COMPLETED untuk memulihkan alarm

Fitur yang sangat penting dari AlarmManager — semua alarm yang dijadwalkan akan diatur ulang setelah perangkat di-restart. Untuk memulihkannya, Anda harus mendeklarasikan BroadcastReceiver yang memproses Intent.ACTION_BOOT_COMPLETED dan menjadwalkan ulang semua alarm aktif dalam metode onReceive. Tanpa ini, pengguna akan kehilangan semua pengingat setelah mematikan dan menyalakan ponsel.

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

Dalam praktiknya, AlarmManager tetap menjadi solusi terbaik untuk aplikasi alarm, kalender, pengingat minum obat, dan tugas apa pun di mana waktu pemicuan sangat penting bagi pengguna. Untuk semua skenario kerja latar lainnya, WorkManager atau JobScheduler lebih disukai.

Saat memilih antara AlarmManager dan WorkManager, ikuti aturan: jika pengguna secara eksplisit meminta pengingat pada pukul 14:30 — gunakan AlarmManager dengan setAlarmClock. Jika tugas harus dijalankan "kira-kira sekali per jam" — WorkManager dengan PeriodicWorkRequest akan lebih hemat energi dan lebih andal.

Pertanyaan yang Sering Diajukan

Apa perbedaan antara setExact dan setAlarmClock?

Kedua metode menjamin pemicuan yang akurat, tetapi setAlarmClock juga menampilkan ikon alarm di bilah status dan memberi tahu sistem bahwa ini adalah alarm untuk pengguna. Pada Android 6+, setAlarmClock memiliki kekebalan dari Doze Mode, sedangkan setExact dapat ditunda.

Bagaimana perilaku AlarmManager setelah perangkat di-restart?

Setelah restart, semua alarm yang dijadwalkan akan diatur ulang. Untuk memulihkannya, Anda perlu mendaftarkan BroadcastReceiver untuk action BOOT_COMPLETED dan menjadwalkan ulang semua tugas di onReceive. Tanpa ini, tidak ada alarm yang akan berfungsi setelah perangkat dinyalakan.

Mengapa setRepeating tidak disarankan pada Android 4.4+?

Mulai API 19, setRepeating menjadi tidak akurat — sistem dapat menggeser interval untuk menghemat energi. Sebagai gantinya, gunakan setExact dengan penjadwalan ulang manual atau WorkManager dengan PeriodicWorkRequest yang memberikan perilaku yang lebih dapat diprediksi.

Izin apa yang diperlukan untuk alarm akurat pada Android 12+?

Untuk setExact diperlukan izin SCHEDULE_EXACT_ALARM, yang dapat diberikan atau dicabut oleh pengguna di pengaturan. Untuk setAlarmClock dengan tampilan di antarmuka jam, digunakan USE_EXACT_ALARM, yang diberikan secara otomatis saat pemasangan dari toko.

Bisakah AlarmManager digunakan tanpa PendingIntent?

Tidak, AlarmManager selalu bekerja melalui PendingIntent. Ini bisa berupa PendingIntent.getBroadcast untuk BroadcastReceiver, PendingIntent.getService untuk Service, atau PendingIntent.getActivity untuk Activity. Tanpa PendingIntent, sistem tidak akan dapat mengirimkan peristiwa ke aplikasi.

Kesimpulan

  • AlarmManager — layanan sistem Android untuk menjalankan tugas pada waktu yang tepat dengan kemampuan membangunkan perangkat.
  • Empat jenis alarm — ELAPSED_REALTIME, RTC, ELAPSED_REALTIME_WAKEUP, dan RTC_WAKEUP — mencakup berbagai skenario.
  • setExact dan setAlarmClock — satu-satunya metode untuk pemicuan akurat pada versi Android modern.
  • setRepeating sudah usang pada Android 4.4+ — gunakan setExact dengan penjadwalan ulang manual.
  • Izin SCHEDULE_EXACT_ALARM wajib pada Android 12+ untuk alarm yang akurat.
  • WorkManager atau JobScheduler lebih disukai untuk tugas latar yang tidak akurat tanpa persyaratan waktu.
  • Jangan lupa menangani BOOT_COMPLETED untuk memulihkan alarm setelah perangkat di-restart.

Kami akan mengembangkan aplikasi seluler turnkey

IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.

Diskusikan proyek

Baca juga