AlarmManager: 핵심 개념 및 알람 작업

저자: IT Sectr 게시일: 2026-03-28 읽는 시간: 8 분

AlarmManager는 애플리케이션이 지정된 시간에 작업을 실행할 수 있도록 하는 Android 시스템 서비스입니다. 애플리케이션이 실행 중이 아니거나 기기가 절전 모드에 있어도 작동합니다. JobScheduler나 WorkManager와 달리 AlarmManager는 정확한 트리거를 보장하므로 알람, 캘린더 알림 및 시간에 민감한 작업에 필수적입니다. Android Developers, 2026에 따르면 Android 4.4부터 setRepeating은 부정확한 반복으로 작동하며 정확한 알람에는 setExact 또는 setAlarmClock이 필요합니다.

핵심 정리

  • AlarmManager는 절전 모드에서도 작동하는, 정확한 시간에 작업을 실행하기 위한 Android 시스템 서비스입니다.
  • 알람 유형에는 ELAPSED_REALTIME, RTC, ELAPSED_REALTIME_WAKEUP 및 RTC_WAKEUP이 있으며, 웨이크업 유무에 따라 구분됩니다.
  • setExact는 Android 4.4+에서 정확한 트리거를 보장하지만 배터리 소모가 더 큽니다.
  • setAlarmClock은 Android 6+에서 시스템이 제시간에 실행을 보장하는 유일한 메서드입니다.
  • Android 12부터 정확한 알람에는 SCHEDULE_EXACT_ALARM 권한이 필요합니다.

AlarmManager란?

AlarmManager는 정확하거나 대략적인 실행 시간으로 작업을 예약하기 위한 API를 제공하는 Android 시스템 서비스입니다. Android 첫 버전부터 존재해왔으며 애플리케이션과 기기 상태에 관계없이 지정된 시간에 코드를 실행하는 유일한 신뢰할 수 있는 방법입니다.

작동 원리는 간단합니다. 애플리케이션이 시스템에 예약된 시간과 함께 PendingIntent를 보냅니다. 지정된 시간이 되면 시스템은 등록된 BroadcastReceiver에 Intent를 보내거나 Service를 시작합니다. 기기가 절전 모드에 있어도 WakeLock을 통해 프로세서가 깨어나 이벤트를 처리할 수 있습니다.

AlarmManager의 주요 적용 분야는 정확한 타이밍이 필요한 작업입니다: 알람, 캘린더 알림, 특정 시간에 장기 실행 작업 시작 등입니다. 정확도가 중요하지 않은 작업(매일 동기화)의 경우 Google은 WorkManager 또는 JobScheduler를 권장합니다. 이들이 더 에너지 효율적이기 때문입니다.

AlarmManager 작동 방식

AlarmManager는 애플리케이션으로부터 PendingIntent와 트리거 시간을 받습니다. 시스템은 이 요청을 내부 스케줄러에 저장하고 지정된 시간에 프로세서를 깨워 Intent를 전달합니다. 개발자는 이 Intent를 처리하기 위해 미리 BroadcastReceiver를 등록해야 합니다.

알람 유형

AlarmManager는 4가지 알람 유형을 지원합니다: ELAPSED_REALTIME(부팅 이후 시간, 깨우지 않음), RTC(실시간, 깨우지 않음), ELAPSED_REALTIME_WAKEUP(부팅 이후 시간, 기기 깨움), RTC_WAKEUP(실시간, 깨움). WAKEUP 버전은 기기가 절전 중일 때도 작업을 실행해야 하는 경우 필요합니다.

유형시간깨움예시
ELAPSED_REALTIME부팅 이후아니요가동 시간 타이머
RTCUnix 타임스탬프아니요로깅
ELAPSED_REALTIME_WAKEUP부팅 이후정기 작업
RTC_WAKEUPUnix 타임스탬프알람 시계

권한 및 권리

Android 12(API 31)부터 정확한 알람(setExact)을 사용하려면 SCHEDULE_EXACT_ALARM 권한이 필요합니다. 사용자는 설정을 통해 이를 취소할 수 있습니다. 디스플레이와 함께 정확한 알람이 필요한 애플리케이션(예: 시계 앱)의 경우 설치 시 부여되는 USE_EXACT_ALARM이 사용됩니다.

set, setRepeating 및 setExact 메서드

AlarmManager는 작업 예약을 위한 세 가지 주요 메서드를 제공합니다. 메서드 선택에 따라 트리거 정확도와 기기 전력 소비에 미치는 영향이 결정됩니다.

set — 일회성 부정확한 트리거를 위한 기본 메서드입니다. 시스템은 다른 이벤트와 그룹화하기 위해 시간을 최대 몇 분까지 이동할 수 있습니다. 정확도가 중요하지 않은 작업(애플리케이션 열기 알림)에 적합합니다.

setRepeating — 정기적 반복을 위한 메서드입니다. Android 4.4(API 19)부터 setRepeating은 부정확해졌습니다 — 간격이 변동될 수 있습니다. 시스템이 더 이상 일정한 주기를 보장하지 않습니다. setRepeating 대신 재예약과 함께 setExact 또는 PeriodicWorkRequest와 함께 WorkManager를 사용하는 것이 좋습니다.

setExact — 정확한 일회성 트리거를 위한 메서드입니다. 시스템은 지정된 시간에 최대한 가깝게 기기를 깨웁니다. setAlarmClock은 setExact의 특별한 경우로, 상태 표시줄에 알람 아이콘을 표시하고 모든 알람 유형 중에서 가장 높은 우선순위를 가집니다.

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

// 정확한 일회성 알람
val intent = Intent(this, AlarmReceiver::class.java)
val pendingIntent = PendingIntent.getBroadcast(
    this, 0, intent,
    PendingIntent.FLAG_IMMUTABLE
)

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

AlarmManager 사용 예제

일반적인 시나리오는 특정 시간에 매일 알림을 만드는 것입니다. 이를 위해 setExact와 함께 RTC_WAKEUP이 사용됩니다. 트리거되면 BroadcastReceiver가 알림 또는 Service를 시작합니다. 처리 후 작업은 다음 날로 재예약되어야 합니다.

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("알림")
            .setContentText("작업을 완료할 시간입니다")
            .setSmallIcon(R.drawable.ic_reminder)
            .build()

        notificationManager.notify(1001, notification)
    }
}

매일 반복의 경우 다음 트리거 시간 계산과 함께 setExact가 사용됩니다. 다양한 유형의 알림을 식별하기 위해 Intent에 플래그를 전달할 수 있습니다. BroadcastReceiver가 WAKEUP 액션 처리와 함께 AndroidManifest.xml에 등록되어 있는지 확인하세요.

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

최적화 및 권장 사항

AlarmManager는 강력하지만 전력을 많이 소비하는 도구입니다. 각 WAKEUP 알람은 기기를 절전 모드에서 깨우며 배터리를 소모합니다. Google은 정확한 알람 사용을 최소화하고 Doze Mode에 미치는 영향을 줄이기 위해 Android 6+에서 setExactAndAllowWhileIdle을 선호할 것을 권장합니다. 정확도가 필요하지 않은 정기적 작업의 경우 PeriodicWorkRequest와 함께 WorkManager를 사용하세요. 기기를 깨울 필요가 없으며 실행할 때마다 배터리를 소모하지 않습니다.

단위 테스트에서 AlarmManager 테스트

AlarmManager 테스트를 위해 Android Test Framework의 TestAlarmManager를 사용하세요. 실제 시간을 기다리지 않고 알람 트리거를 에뮬레이트할 수 있습니다. Robolectric은 set, setExact 및 setRepeating 호출을 가로채는 ShadowAlarmManager를 제공하여 강제 트리거 및 예약된 작업 수 확인을 위한 메서드를 제공합니다. BroadcastReceiver의 단위 테스트에는 Robolectric.getForegroundScheduler()를 사용하세요. 통합 테스트에서 알람 트리거를 기다리는 IdlingResource를 사용한 Espresso 테스트도 사용할 수 있습니다.

AlarmManager에서 WorkManager로 마이그레이션

애플리케이션이 정확한 타이밍이 필요하지 않은 정기적 작업에 AlarmManager를 사용하는 경우 WorkManager로 마이그레이션을 고려하세요. 최소 15분 간격의 PeriodicWorkRequest가 setRepeating을 대체하며, WorkManager는 재부팅 후 실행을 보장하고 Doze Mode를 처리하며 SCHEDULE_EXACT_ALARM 권한이 필요하지 않습니다. 시간에 민감한 작업(오전 7시 알람)의 경우 AlarmManager가 유일한 올바른 선택입니다. 최적의 전략은 setAlarmClock과 함께 알람에만 AlarmManager를 사용하고 다른 모든 백그라운드 작업은 WorkManager로 이동하는 것입니다.

정확도가 필요하지 않은 정기적 작업에는 PeriodicWorkRequest와 함께 WorkManager를 사용하세요. 정확한 타이밍이 필요하지만 절전 모드에서 트리거가 중요하지 않은 작업의 경우 — WAKEUP 없이 setExact를 사용하세요. 그리고 필수 웨이크업이 필요한 알람에만 — setAlarmClock 또는 RTC_WAKEUP을 사용하세요.

Android 12+에서 SCHEDULE_EXACT_ALARM 권한을 확인하는 것도 중요합니다. 권한이 부여되지 않은 경우 setExact는 일반 set(부정확)처럼 작동합니다. 확인하려면 AlarmManager.canScheduleExactAlarms()를 사용하세요. 권한이 없는 경우 Intent(Settings.ACTION_REQUEST_SCHEDULE_EXACT_ALARM)을 통해 사용자에게 설정으로 이동하도록 요청할 수 있습니다.

알람 복원을 위한 BOOT_COMPLETED 처리

AlarmManager의 매우 중요한 특징 — 기기 재부팅 후 예약된 모든 알람이 재설정됩니다. 이를 복원하려면 Intent.ACTION_BOOT_COMPLETED를 처리하는 BroadcastReceiver를 선언하고 onReceive 메서드에서 모든 활성 알람을 재예약해야 합니다. 이 작업 없이 사용자는 전화를 껐다 켠 후 모든 알림을 잃게 됩니다.

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

실제로 AlarmManager는 알람 시계 앱, 캘린더, 약 복용 알림 및 실행 시간이 사용자에게 중요한 모든 작업에 가장 적합한 솔루션입니다. 다른 모든 백그라운드 작업 시나리오에서는 WorkManager 또는 JobScheduler가 선호됩니다.

AlarmManager와 WorkManager 중에서 선택할 때 다음 규칙을 따르세요: 사용자가 명시적으로 오후 2:30에 알림을 요청한 경우 — setAlarmClock과 함께 AlarmManager를 사용하세요. 작업이 “대략 한 시간에 한 번” 실행되어야 하는 경우 — PeriodicWorkRequest와 함께 WorkManager가 더 에너지 효율적이고 안정적입니다.

자주 묻는 질문

setExact와 setAlarmClock의 차이점은 무엇인가요?

두 메서드 모두 정확한 트리거를 보장하지만 setAlarmClock은 추가로 상태 표시줄에 알람 아이콘을 표시하고 시스템에 사용자 알람임을 알립니다. Android 6+에서 setAlarmClock은 Doze Mode로부터 면역되지만 setExact는 지연될 수 있습니다.

기기 재부팅 후 AlarmManager는 어떻게 동작하나요?

재부팅 후 예약된 모든 알람이 재설정됩니다. 이를 복원하려면 BOOT_COMPLETED 액션에 대한 BroadcastReceiver를 등록하고 onReceive에서 모든 작업을 재예약해야 합니다. 이 작업 없이 기기를 켠 후에는 어떤 알람도 트리거되지 않습니다.

Android 4.4+에서 setRepeating이 권장되지 않는 이유는 무엇인가요?

API 19부터 setRepeating이 부정확해졌습니다 — 시스템이 전력 절약을 위해 간격을 이동할 수 있습니다. 대신 수동 재예약과 함께 setExact 또는 더 예측 가능한 동작을 제공하는 PeriodicWorkRequest와 함께 WorkManager를 사용하세요.

Android 12+에서 정확한 알람에 필요한 권한은 무엇인가요?

setExact의 경우 SCHEDULE_EXACT_ALARM 권한이 필요하며 사용자는 설정에서 이를 부여하거나 취소할 수 있습니다. 시계 인터페이스 표시와 함께 setAlarmClock의 경우 스토어에서 설치 시 자동으로 부여되는 USE_EXACT_ALARM이 사용됩니다.

PendingIntent 없이 AlarmManager를 사용할 수 있나요?

아니요, AlarmManager는 항상 PendingIntent를 통해 작동합니다. BroadcastReceiver의 경우 PendingIntent.getBroadcast, Service의 경우 PendingIntent.getService, Activity의 경우 PendingIntent.getActivity가 될 수 있습니다. PendingIntent가 없으면 시스템이 애플리케이션에 이벤트를 전달할 수 없습니다.

요약

  • AlarmManager는 기기 웨이크업 기능과 함께 정확한 시간에 작업을 실행하기 위한 Android 시스템 서비스입니다.
  • 네 가지 유형의 알람 — ELAPSED_REALTIME, RTC, ELAPSED_REALTIME_WAKEUP 및 RTC_WAKEUP — 다양한 시나리오를 다룹니다.
  • setExact 및 setAlarmClock은 최신 Android 버전에서 정확한 트리거를 위한 유일한 메서드입니다.
  • setRepeating은 Android 4.4+에서 더 이상 사용되지 않습니다 — 수동 재예약과 함께 setExact를 사용하세요.
  • SCHEDULE_EXACT_ALARM 권한은 Android 12+에서 정확한 알람에 필수입니다.
  • WorkManager 또는 JobScheduler는 시간 요구 사항이 없는 부정확한 백그라운드 작업에 선호됩니다.
  • 잊지 마세요 기기 재부팅 후 알람을 복원하기 위해 BOOT_COMPLETED를 처리하는 것을.

턴키 방식의 모바일 애플리케이션을 개발해 드립니다

IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.

프로젝트 논의

더 읽어보기