포그라운드 서비스의 액티비티 시작 제한
포그라운드 서비스의 액티비티 시작 제한
Android 10(API 29)부터 포그라운드 서비스를 실행 중인 앱은 백그라운드에서 직접 Activity를 시작하는 것이 원칙적으로 제한됩니다. 포그라운드 서비스가 사용자에게 인식되는 진행 중인 작업을 나타내더라도, 시스템은 새로운 Activity를 시작할 수 있는지 판단할 때 해당 앱을 백그라운드 상태로 간주합니다. 따라서 권장되는 대안은 시간에 민감한 알림(time-sensitive notification)을 표시하여 사용자가 직접 상호작용 시점을 선택할 수 있도록 하는 것입니다. 이번 면접 질문을 통하여 아래 내용들을 학습하실 수 있습니다.
- 포그라운드 서비스에서도 안드로이드가 백그라운드
Activity시작을 제한하는 이유를 설명할 수 있습니다. - 무분별한 백그라운드
Activity시작이 유발하는 사용자 경험 문제를 파악할 수 있습니다. - 포그라운드 서비스 상호작용을 위한 알림 기반 대안을 구현할 수 있습니다.
- 백그라운드
Activity시작이 허용되는 구체적인 예외 조건을 식별할 수 있습니다. - 포그라운드 서비스의 지속 알림과 시간에 민감한 상호작용 프롬프트의 차이를 구분할 수 있습니다.
제한이 도입된 이유
Android 10 이전에는 포그라운드 서비스를 가진 앱이라면 언제든지 Activity를 실행할 수 있었습니다. 이는 곧 다운로드를 수행하거나 위치를 추적하는 앱이, 사용자가 메시지를 입력하거나 영상을 시청하거나 다른 앱을 사용하는 도중에 화면을 갑자기 가로챌 수 있었다는 의미입니다. 이러한 갑작스러운 화면 전환은 사용자 입장에서 매우 불쾌한 경험이었으며, 사용자가 이를 통제할 수 있는 수단이 전혀 없었습니다.
Android 10에서는 사용자가 화면에 표시되는 내용을 직접 제어할 수 있도록 백그라운드 Activity 시작 제한(background activity start restrictions)이 도입되었습니다. 시스템은 포그라운드 서비스를 가진 앱이라 하더라도, 사용자가 해당 앱의 UI와 직접 상호작용하고 있지 않다면 백그라운드 상태로 판단합니다. 포그라운드 서비스 자체는 실행 중이지만, 사용자는 이미 다른 Activity나 홈 화면으로 이동한 상태이기 때문입니다.
실제 면접에서는 단순히 "제한이 있다"는 사실만 아는 것보다, 왜 이 제한이 필요했는지를 설명할 수 있어야 합니다. 사용자 경험 관점에서 설명하면 면접관에게 좋은 인상을 남길 수 있습니다.
알림 기반 대안
Activity를 직접 시작하는 대신, 포그라운드 서비스는 시간에 민감한 알림을 표시해야 합니다. 이 알림은 사용자가 기기를 활성 상태로 사용 중일 때 헤드업 알림(heads-up notification)으로 표시되어 화면을 가로채지 않으면서도 즉각적인 가시성을 확보할 수 있습니다. 사용자는 이 알림을 무시하거나, 상호작용하거나, 편한 시점에 처리할 수 있습니다.
수신 전화나 알람처럼 알림이 반드시 즉시 확인되어야 하는 상황에서는 풀스크린 인텐트(full-screen intent)를 포함할 수 있습니다. 기기 화면이 꺼져 있을 때는 풀스크린 인텐트가 Activity를 직접 실행하고, 화면이 켜져 있을 때는 헤드업 알림으로 표시됩니다.
val fullScreenIntent = Intent(context, CallActivity::class.java)
val pendingIntent = PendingIntent.getActivity(
context, 0, fullScreenIntent,
// FLAG_IMMUTABLE 또는 FLAG_MUTABLE 플래그 지정 필수 (Android 12+)
PendingIntent.FLAG_IMMUTABLE
)
val notification = NotificationCompat.Builder(
context, CHANNEL_ID
)
.setSmallIcon(R.drawable.ic_call)
.setContentTitle("Incoming call")
.setPriority(NotificationCompat.PRIORITY_HIGH) // 헤드업 알림을 위해 HIGH 우선순위 설정
.setCategory(NotificationCompat.CATEGORY_CALL) // 수신 전화 카테고리 지정
.setFullScreenIntent(pendingIntent, true) // 화면 꺼진 상태에서 전체 화면 표시
.build()
이 알림에는 PendingIntent가 포함되어 있어, 사용자가 탭하면 원하는 Activity를 시작합니다. 이러한 접근 방식은 사용자의 현재 작업 흐름을 존중하여, 앱과 상호작용할 시점을 사용자가 직접 결정할 수 있게 합니다. setFullScreenIntent 호출을 통해 화면이 꺼져 있을 때는 Activity가 바로 실행되고, 화면이 켜져 있을 때는 헤드업 알림이 표시되도록 보장합니다.
포그라운드 서비스 타입과 Android 14 이상의 변화
Android 14(API 34)부터는 포그라운드 서비스가 매니페스트에서 android:foregroundServiceType 속성을 사용하여 서비스 타입을 반드시 선언해야 합니다. 이를 통해 개발자가 서비스의 용도를 사전에 명시하도록 요구함으로써, 포그라운드 서비스가 수행할 수 있는 작업을 더욱 엄격하게 제한합니다.