라벨이 Notification인 게시물 표시

안드로이드 백그라운드 타이머 구현 및 Foreground Service 알림 설계 정리

타이머 앱을 만들고 운영하다 보면 백그라운드 처리 때문에 골치 아픈 일이 많습니다. 화면이 켜져 있을 때는 잘 돌다가도, 사용자가 홈 버튼을 누르고 다른 앱을 보거나 화면을 꺼버리면 타이머가 멈추거나 종료 알림이 안 오는 현상이 발생하곤 합니다. 처음에는 무조건 Foreground Service로 다 돌리면 해결될 줄 알았는데, 실제 서비스를 운영해 보니 배터리 소모나 구글 플레이 정책 측면에서 고려할 게 한두 가지가 아니었습니다. 자꾸 까먹어서 나중에도 바로 보고 적용할 수 있도록 실무 기준으로 정리해 둡니다. 백그라운드 타이머 운영 시 자주 겪는 문제 보통 처음 구현할 때 아래와 같은 지점에서 막히거나 실수를 많이 합니다. 화면이 꺼지면 타이머가 같이 멈춰버리는 현상 앱을 백그라운드로 보낸 뒤 타이머 종료 알림이 먹통이 되는 상황 모든 카운트다운을 무조건 Foreground Service로 처리해서 배터리를 낭비하는 구조 상단 알림창에 일시정지, 재개, 종료 같은 제어 버튼이 없는 불편함 알림 채널 중요도를 너무 높여서 사용자에게 과도한 피로감을 주는 경우 PendingIntent 나 로그에 사용자 ID나 민감한 데이터를 그대로 남기는 보안 실수 백그라운드 타이머를 작업할 때는 "코드를 백그라운드에서 계속 실행한다"가 아니라, "사용자가 인지할 수 있는 지속된 작업과 종료 알림을 조합한다"로 접근하는 것이 운영상 훨씬 안전합니다. 핵심 개념: 계산은 상태로, 표시는 알림으로 분리 타이머의 남은 시간은 매초 줄어드는 루프 코드가 아니라, 시작 기준 시각과 현재 시각의 차이 로 계산하는 것이 정석입니다. Foreground Service는 시간을 계산하는 주체가 아니라, 백그라운드에서도 사용자에게 "타이머가 돌고 있다"는 것을 보여주고 제어할 수 있게 돕는 창구일 뿐입니다. 저의 경우 아래와 같이 역할을 나누어 구조를 잡았습니다. 구성 요소 역할 주의할 점 TimerSession 시작 시각, 전체 시간, 일...

Android 알림 채널 설계 가이드 - Android NotificationChannel을 알림 종류별로 나누는 설계 기준

안드로이드 앱을 개발하고 운영하다 보면 푸시 알림 처리는 필수입니다. Android 8.0(API 26) 이상부터는 NotificationChannel 을 무조건 만들어야 알림이 뜨는데요. 이게 단순히 알림을 띄우기 위한 통로가 아니라, 사용자가 시스템 설정에서 알림 종류별로 소리, 진동, 배지 등을 직접 제어하는 단위입니다. 처음에는 귀찮아서 default 채널 하나만 만들어서 모든 푸시를 다 몰아넣기 쉬운데요, 이러면 나중에 운영할 때 고생하게 됩니다. 마케팅 알림이 보기 싫어서 사용자가 채널을 꺼버리면, 중요한 주문 알림이나 공지까지 통째로 차단되기 때문입니다. 반대로 너무 잘게 쪼개면 설정 화면이 지저분해져서 관리하기 힘들어집니다. 실무에서 채널을 어떤 기준으로 나눠야 하는지, 그리고 운영할 때 어떤 점을 조심해야 하는지 경험을 바탕으로 정리해 둡니다. 나중에 잊어버리면 다시 보려고 남기는 기록입니다. 운영 중 자주 겪는 채널 관련 문제들 막상 서비스에 푸시를 붙여서 운영하다 보면 아래와 같은 문제들이 꼭 터집니다. 모든 푸시를 default 채널 하나로 처리: 사용자가 특정 알림만 끄고 싶어도 방법이 없습니다. 마케팅과 필수 알림 병합: 광고성 푸시 때문에 중요한 배송/결제 알림까지 같이 먹통이 됩니다. 개발자 중심의 채널명: 채널 이름을 noti_ch_01 같은 형태로 만들어서 사용자가 설정 화면을 봐도 뭔지 모르게 만듭니다. 코드로 중요도 수정 시도: 운영 중에 중요도를 코드로 바꾸려 하지만, 이미 생성된 채널은 사용자 설정이 우선이라 반영되지 않아 당황합니다. Android 13 권한과의 혼동: 전체 알림 권한과 개별 채널 설정을 같은 개념으로 오해해서 예외 처리가 꼬입니다. 기본 개념: 채널은 개발자가 아닌 '사용자'의 설정 단위입니다 채널을 생성할 때 들어가는 값들은 사용자가 시스템 설정 화면에서 그대로 보게 되는 항목들입니다. 처음부터 신중하게 정의해야 합니다. 항목 의미 설계 기준 channelId 코드에서 사용...