본문 바로가기

Android 공부/프로젝트 회고

My-Alarm

My-Alarm 

(2025.03 ~ 2025.11)

Skills:         Kotlin, Jetpack Compose, Navigation, AlarmManager, Room, Hilt, MVI, Flow

Tools:         GitHub

Member:    Android(1)

Github:       https://github.com/posite/AlarmService

기여도:         Android 100%

 

Project Info

    Samsung의 시계 앱을 참고하여 AlarmManager와 Jetpack Compose를 적용하여 구현한 토이 프로젝트 입니다.

 

App Architecture

MVI - 단방향 흐름 구조

 

고민한 흔적

알람을 위한 백그라운드 서비스 구현 방법

나에게 주어진 선택지 : WorkManager와 AlarmManager 방식

고민 및 나의 선택

  • WorkManager
    • 정확한 실행 시각 보장 불가 : 언젠가 실행됨을 보장할 뿐 정확한 시간을 보장하지 않음
    • Doze Mode 또한 실행이 지연되어 반려하게 됨
  • AlarmManager
    • 정확한 시각에 실행 가능
    • setExactAndAllowWhileIdle()을 통해 Doze Mode 중이어도 강제로 깨워서 실행함
    • 이러한 중요한 기능들이 가능하여 AlarmManager 채택

적용 및 결과

  • 정확한 시간에 알람 실행
  • Doze Mode에서도 알람이 실행됨

 

기기 재부팅 후 사라지는 알람들

원인 : 기기 재부팅 시 AlarmManager에 등록된 알람들이 초기화 됨

고민 및 해결 방안

  • 기기 부팅 후 재등록 방안 필요
    • 기기의 부팅을 감지하고 작업을 수행시킬 BroadcastReceiver 구현 필요
    • BroadcastReceiver 등록 및 Intent.ACTION_BOOT_COMPLETED일 때 DB의 알람 재등록 로직 구현
  • BroadcastReceiver의 onReceive()의 제약
    • 10초 내외의 짧은 시간만 작업 허용 -> 재등록 작업 완료 전에 종료될 수 있음
    • 메인 스레드에서 수행하기에 DB 처리 불가능
    • 재부팅 후 최대한 빠르게 DB를 읽고 재등록하기 위해 가장 적합한 WorkManager의 setExpedited() 적용

적용 및 결과

  • 재부팅 후, 등록된 알람이 누락 없이 전부 재등록 됨

 

잠금화면 위에 알람 화면 띄우기

문제점 : 화면이 꺼져 있거나 잠겨 있어도 알람이 울리고, 알람을 종료하기 위한 UI가 보여야 함

고민 및 나의 선택

  • 화면을 띄울 방법 찾기
    • 잠금 화면에서도 보이게 하기 위한 Activity 함수 setShowWhenLocked(true) 적용, 안될 경우를 대비해서 OverlayPermission를 앱 처음 실행 시 요청함
    • 화면이 꺼져 있어도 키게 하는 Activity 함수 setTurnScreenOn(true) 적용
  • 알람 종료 방식
    • 한쪽 방향으로 스와이프 하는 방식 : 특정한 방향으로만 해제 가능
    • 원형 드래그 방식 : 모든 방향으로 드래그 하여 해제 가능

적용 및 결과

  • 화면이 꺼져있거나 잠겨 있어도 알람 실행 및 종료를 위한 UI가 표시됨
  • 원형 드래그 방식을 적용하여 원하는 모든 방향으로 드래그 하여 해제 가능하게 됨

 

 

🟢 Keep (유지할 점)

  • MVI 설계 및 적용 :  BaseViewModel에 Event, State, Effect를 제네릭으로 추상화
  • UX를 고민하여 직접 구현 및 비교 : 스와이프 방식과 원형 드래그 방식을 각각 구현 및 비교 및 더 나은 방식 선택
  • 필요에 의한 Library 사용 : AlarmManager와 WorkManager를 기능과 설계 목적에 알맞게 사용함
  • 가로/세로 모드 대응 : orientation으로 분기하여 각각 구현함

🔴 Problem (문제점 및 아쉬운 점)

  • 앱 시작과 동시에 여러 권한 요청 : 설명 없이 요청부터 하는 구조 -> 거부했을 때 동작하지 않는 이유 설명 필요
  • 알람 해제 방법 부재 : 알람 해제 방법을 Text를 통해 전달하기
  • 요일 미선택 시 동작 방식에 대한 설명 부재 : 요일을 선택하지 않으면 알람이 매일 작동하는지 아예 작동하지 않는지 알 수 없음

🔵 Try (다음 프로젝트에서 시도할 것)

  • 권한 요청을 온보딩으로 분리하고 설명 추가하기 : 권한이 필요한 이유를 설명하고 순서대로 요청하는 방식으로 개선하기
  • 각각의 기능 및 UI에 대한 설명 추가하기 : 설명을 위한 힌트 Text로 명시적으로 표시하거나 애니메이션을 통해 인터랙션 방법을 쉽게 전달하기

'Android 공부 > 프로젝트 회고' 카테고리의 다른 글

QuietNight  (0) 2026.05.07
GitRank-v2  (0) 2026.02.26
똑립  (0) 2026.02.25
GitRank  (0) 2026.02.24