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 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.
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.
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.
| Jenis | Waktu | Bangun | Contoh |
|---|---|---|---|
| ELAPSED_REALTIME | sejak boot | tidak | timer waktu kerja |
| RTC | Unix timestamp | tidak | pencatatan log |
| ELAPSED_REALTIME_WAKEUP | sejak boot | ya | tugas periodik |
| RTC_WAKEUP | Unix timestamp | ya | alarm |
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.
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.
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
)
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.
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.
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 — 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.
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.
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).
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.
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
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.
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.
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.
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.
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
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.
Baca juga