이 튜토리얼에서는 안드로이드에서 AlarmManager를 사용해 특정 시간에 알람을 설정하고, 하루에 한 번씩 반복 실행되는 알람을 구현하는 방법을 단계별로 살펴봅니다. 사용자가 TimePicker로 원하는 시간을 선택하면 AlarmManager가 해당 시각에 BroadcastReceiver를 통해 알람 이벤트를 발생시키는 구조입니다.
AlarmManager란?
AlarmManager는 앱이 실행 중이 아니더라도 지정된 시점에 코드를 실행할 수 있도록 해주는 안드로이드 시스템 서비스입니다. 알람 앱, 주기적인 데이터 동기화, 리마인더 알림 등 정확한 시간 기반 작업이 필요할 때 유용하게 활용됩니다.
1단계 – 새 프로젝트 생성
Android Studio에서 File ⇒ New Project를 선택하고, 필요한 정보를 모두 입력해 새 프로젝트를 생성합니다.
2단계 – 레이아웃 작성 (res/layout/activity_main.xml)
TimePicker와 알람 설정 버튼을 포함한 레이아웃을 아래와 같이 작성합니다.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="8dp"
tools:context=".MainActivity">
<LinearLayout
android:id="@+id/linearLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:orientation="vertical">
<TimePicker
android:id="@+id/timePicker"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:layout_gravity="center"
android:id="@+id/buttonAlarm"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Set Alarm" />
</LinearLayout>
</RelativeLayout>3단계 – 메인 액티비티 코드 작성 (MainActivity.kt)
아래 코드는 Kotlin으로 작성되어 있습니다. TimePicker에서 선택한 시간을 Calendar 객체에 저장한 뒤, setRepeating() 메서드를 호출해 매일 반복되는 알람을 등록합니다. API 23(마시멜로) 이상 여부에 따라 시간 값을 가져오는 방식이 다르다는 점에 유의하세요.
import android.app.AlarmManager
import android.app.PendingIntent
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.os.Build
import android.os.Bundle
import android.util.Log
import android.widget.Button
import android.widget.TimePicker
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import java.util.*
class MainActivity : AppCompatActivity() {
lateinit var btnSetAlarm: Button
lateinit var timePicker: TimePicker
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
title = "KotlinApp"
timePicker = findViewById(R.id.timePicker)
btnSetAlarm = findViewById(R.id.buttonAlarm)
btnSetAlarm.setOnClickListener {
val calendar: Calendar = Calendar.getInstance()
if (Build.VERSION.SDK_INT >= 23) {
calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH), timePicker.hour, timePicker.minute, 0)
}
else {
calendar.set(calendar.get(Calendar.YEAR),
calendar.get(Calendar.MONTH),
calendar.get(Calendar.DAY_OF.MONTH),
timePicker.currentHour,
timePicker.currentMinute, 0)
}
setAlarm(calendar.timeInMillis)
}
}
private fun setAlarm(timeInMillis: Long) {
val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager
val intent = Intent(this, MyAlarm::class.java)
val pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0)
alarmManager.setRepeating(AlarmManager.RTC, timeInMillis, AlarmManager.INTERVAL_DAY, pendingIntent)
Toast.makeText(this, "Alarm is set", Toast.LENGTH_SHORT).show()
}
private class MyAlarm : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
Log.d("Alarm Bell", "Alarm just fired")
}
}
}4단계 – AndroidManifest.xml 설정
매니페스트 파일에는 별도의 권한 선언 없이 액티비티만 등록하면 됩니다. BroadcastReceiver는 코드 내부에 내부 클래스로 정의되어 있으므로 매니페스트에 추가로 선언할 필요가 없습니다.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android" package="com.example.q11">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>앱 실행 및 결과 확인
실제 안드로이드 기기를 컴퓨터에 연결한 상태에서, 프로젝트의 액티비티 파일 중 하나를 연 뒤 툴바의 Run 아이콘을 클릭합니다. 실행할 기기로 연결된 모바일 기기를 선택하면, 앱이 기기에 설치되어 기본 화면이 표시됩니다. TimePicker에서 원하는 시간을 선택하고 Set Alarm 버튼을 누르면 "Alarm is set" 토스트 메시지와 함께 알람이 등록됩니다.

알람 구현 시 참고 사항
- PendingIntent 플래그: Android 12(API 31) 이상에서는 PendingIntent 생성 시
FLAG_IMMUTABLE또는FLAG_MUTABLE플래그를 반드시 지정해야 합니다. 그렇지 않으면 앱이 크래시될 수 있습니다. - 반복 알람의 정확도: API 19(킷캣)부터
setRepeating()은 배터리 최적화를 위해 OS가 알람 시간을 조정할 수 있어 정확성이 보장되지 않습니다. 정확한 시간에 실행해야 한다면setExactAndAllowWhileIdle()사용을 고려하세요. - 구조 개선: 실제 프로젝트에서는 BroadcastReceiver를 별도의 클래스 파일로 분리하고, 알람 발생 시 Notification을 함께 띄우는 방식이 일반적입니다.