Android/Side Projects

My Alarm 앱 개발하기

화요밍 2022. 2. 9. 21:34
728x90
반응형
Side Project - My Alarm
시간을 지정해 알람을 설정하고, 지정된 시간이 되면 알람이 울리는 앱을 구현한 프로젝트

 

GitHub - hwayeon351/My-Alarm

Contribute to hwayeon351/My-Alarm development by creating an account on GitHub.

github.com


학습 회고

오늘은 알람 앱에 AlarmManager를 통해 알람을 등록하고 해당 시간이 되면 BroadcastReceiver를 통해 Notification을 띄우는 기능을 구현하여 프로젝트를 완성하였다.


오늘 공부한 내용

  • AlarmManager

AlarmManager를 사용하면 앱을 사용하고 있지 않을 때에도 시간에 맞춰 수행해야 하는 작업을 실행할 수 있다.

알람은 지정된 시간이나 특정 간격으로 인텐트를 실행한다.

Broadcast receiver와 함께 알람을 사용해서 서비스를 시작하고 다른 작업을 실행할 수 있다.

알람은 앱 외부에서 작동한다.

따라서 알람을 사용하면 앱이 실행 중이 아니거나 대기 상태인 경우에도 이벤트나 작업을 트리거할 수 있다.

알람을 사용하면 타이머나 백그라운드 서비스를 사용하지 않고 작업을 예약할 수 있기 때문에 리소스 사용을 최소화 하는 데 도움이 된다.

* 앱이 실행 중인 상태에서 시간 기반 작업을 하려면 Timer나 Thread와 Handler를 사용해야 Android가 시스템 리소스를 더 효과적으로 제어할 수 있다.

 

반복되는 알람을 잘못 설계하면 배터리 소모가 발생할 수 있기 때문에 조심해야 한다.

또한, 서버와 데이터를 동기화하는 네트워킹 작업을 수행하기 위해 반복 알람을 설계하는 것은 서버에 큰 부담을 줄 수 있기 때문에 다른 방법을 사용하는 것이 좋다.

 

또, 주의해야할 점은 기기가 잠자기 모드인 경우, 즉, 사용자가 기기를 장시간 사용하지 않아 idle 상태일 때에는 알람이 울리지 않는다.

Android 6.0(API 수준 23)부터 기기의 배터리 수명을 연정하기 위해 잠자기 및 앱 대기가 도입 되었다.

앱이 idle 상태이면 앱 대기모드로 전환된다. 이는 사용자가 일정 시간 동안 앱을 사용하지 않았으며 앱에 포그라운드 프로세스가 없다는 의미이다.

예약된 알람이 있는 경우 기기가 충전 중이거나, 잠자기 모드를 종료할 때까지 지연이 된다.

만약, 기기가 idle 상태인 경우에도 예약된 작업을 수행해야 한다면 setAndAllowWhileIdle()과 setExactAndAllowWhileIdle()을 사용하면 된다.

 

 

  • 반복 알람 설정

1. 알람 유형 선택

알람에는 실제 경과 시간(ELAPSED_REALTIME)과 실시간 시계(RTC) 두 가지 유형이 있다.

실제 경과 시간은 시스템 부팅 이후 시간을 사용하고, 실제 경과 시간은 30초마다 실행되는 알람처럼 경과 시간에 기반한 알람을 설정하는데 적합하다.

실시간 시계는 UTC(실제 시간) 시간을 사용하고, 현재 기기에 설정된 언어에 따라 달라져야 하는 알람에 적합하다.

 

이 두 유형에는 wakeup버전을 설정할 수 있는데, wakeup을 설정하면 지정된 시간이 경과하면 기기의 절전 모드를 해제하고 대기 중인 인텐트를 실행한다.

 

 

2. 트리거 시간 설정

 

3. 알람의 간격 설정

간격은 하루에 한 번, 매 시간마다, 5분마다 등으로 설정할 수 있다.

 

4. PendingIntent 설정

알람이 트리거되면 실행되어야 하는 인텐트를 설정해야 한다. 만약 동일한 PendingIntent를 사용하는 두 번째 알람이 있다면 이 알람이 원래 알람을 대체한다.

 

val calendar = Calendar.getInstance().apply {
    set(Calendar.HOUR_OF_DAY, newModel.hour)
    set(Calendar.MINUTE, newModel.minute)

    if (before(Calendar.getInstance())) {
        add(Calendar.DATE, 1)
    }
}

val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager
val intent = Intent(this, AlarmReceiver::class.java)
val pendingIntent = PendingIntent.getBroadcast(
    this,
    ALARM_REQUEST_CODE,
    intent,
    PendingIntent.FLAG_UPDATE_CURRENT
)
alarmManager.setInexactRepeating(
    AlarmManager.RTC_WAKEUP,
    calendar.timeInMillis,
    AlarmManager.INTERVAL_DAY,
    pendingIntent
)

 

  • 알람 취소

알람이 트리거 되었을 때 수행되는 PendingIntent를 취소하려면 FLAG_NO_CREATE를 PendingIntent.getService()에 전달하고, 인텐트의 인스턴스가 존재한다면 가져온다.

인텐트 인스턴스를 AlarmManager.cancel()에 전달해서 작업을 취소할 수 있다.

val pendingIntent = PendingIntent.getBroadcast(this, ALARM_REQUEST_CODE, Intent(this, AlarmReceiver::class.java), PendingIntent.FLAG_NO_CREATE)
pendingIntent?.cancel()

 

 

 

728x90
반응형

'Android > Side Projects' 카테고리의 다른 글

도서 리뷰 앱 개발하기  (0) 2022.02.11
도서 리뷰 앱 개발하기  (1) 2022.02.10
My Alarm 앱 개발하기  (0) 2022.02.08
오늘의 명언 앱 개발하기  (1) 2022.02.07
오늘의 명언 앱 개발하기  (0) 2022.02.06