Service는 음악 재생, 데이터 동기화, 진행 중인 file 전송처럼 자체 사용자 interface 없이 작업을 수행할 수 있는 Android의 구성 요소입니다. Service는 activity, broadcast receiver, content provider와 함께 Android의 네 가지 기본 앱 구성 요소 중 하나이며, 다른 구성 요소와 마찬가지로 앱의 AndroidManifest.xml에 등록되어야 합니다. 기본적으로 service는 앱의 main thread에서 실행되므로 무거운 작업은 여전히 background thread로 옮겨야 합니다.
Android는 중지될 때까지 작업을 수행하는 started service와 다른 구성 요소가 bind하여 통신할 수 있는 bound service를 구분합니다. Foreground service는 사용자가 인지하는 작업을 수행하며 지속적인 알림을 표시해야 합니다. Background 작업은 battery 수명과 성능에 영향을 주므로 Android는 앱이 background에서 service를 시작할 수 있는 시점에 대한 제한을 점차 도입했으며, 미룰 수 있는 작업에는 Google이 보통 대신 WorkManager를 권장합니다.
Android의 service는 음악 재생, 동기화, file 전송처럼 자체 사용자 interface 없이 작업을 수행하는 앱 구성 요소입니다. Service는 작업을 수행하도록 시작되거나, 통신하려는 다른 구성 요소에 의해 bind될 수 있습니다. Foreground service는 사용자가 작업이 진행 중임을 알 수 있도록 지속적인 알림을 표시하며, Android의 background 작업 제한 때문에 미룰 수 있는 작업에는 WorkManager가 자주 사용됩니다.
More about Service
Service는 activity, broadcast receiver, content provider와 함께 Android 앱의 네 가지 기본 구성 요소 중 하나입니다. Activity는 사용자가 상호 작용하는 화면을 보여 줍니다. 이에 반해 service는 사용자 interface가 필요 없거나 사용자가 화면을 떠나도 계속되어야 하는 작업에 사용됩니다. 대표적인 예로는 음악이나 podcast 재생, 길 안내, file 업로드, server와의 데이터 동기화가 있습니다.
기술적으로 service는 android.app.Service를 상속하고 AndroidManifest.xml에 service 요소로 등록되는 class입니다. 시스템은 onCreate(), onStartCommand(), onBind(), onDestroy() 같은 메서드를 통해 service의 lifecycle을 제어합니다. Service가 자동으로 별도의 thread에서 실행되지 않는다는 점을 알아 두는 것이 중요합니다. 기본적으로 service의 코드는 앱의 main thread에서 실행되므로, 앱이 응답하지 않게 되는 것을 막으려면 오래 걸리거나 blocking되는 작업을 예를 들어 Kotlin coroutine으로 background thread로 옮겨야 합니다.
Service는 여러 방식으로 사용할 수 있으며, 각 방식은 서로 다른 필요에 적합합니다.
Foreground service: 음악 재생이나 진행 중인 운동 추적처럼 사용자가 인지하는 작업을 수행합니다. Foreground service는 지속적인 알림을 표시해야 하며, 최신 Android 버전에서는 앱이 service 유형을 선언하고 관련 permission을 보유해야 합니다.
Background service: 사용자가 직접 보지 않는 작업을 수행합니다. Android 8.0부터 앱이 background에 있는 동안 이러한 service를 시작할 수 있는 시점에 엄격한 제한이 있습니다.
Bound service: 다른 앱의 구성 요소를 포함한 다른 구성 요소가 service에 bind하여 요청을 보내고 응답을 받을 수 있는 client-server interface를 제공합니다. Bound service는 적어도 하나의 구성 요소가 bind되어 있는 동안 유지됩니다.
Service의 가장 큰 강점 중 하나는 앱이 특정 화면에 묶이지 않고 중요한 작업을 계속할 수 있게 한다는 점입니다. 동시에 background 작업은 battery, memory, 데이터를 사용하므로 주의가 필요합니다. 그래서 Android는 background 작업을 제한하는 규칙을 점차 도입했으며, 사용자는 foreground service를 실행 중인 앱을 보고 중지할 수 있습니다.
많은 작업에 대해 Google은 대신 Android Jetpack의 일부인 WorkManager를 권장합니다. WorkManager는 앱이 닫히거나 기기가 재시작되어도 안정적으로 수행되어야 하고, log file 업로드나 주기적 동기화처럼 미룰 수 있는 작업을 위한 것입니다. WorkManager는 시스템의 제한을 고려하며, network 연결이나 충전 같은 조건으로 구성할 수 있습니다.
요약하면 service는 앱이 사용자가 계속되기를 기대하는 진행 중인 작업을 수행해야 하거나 다른 구성 요소가 오래 실행되는 process와 통신해야 할 때 올바른 선택입니다. 올바른 유형의 service를 선택하거나 작업을 미룰 수 있을 때 WorkManager를 선택하면 개발자는 기능적이면서도 기기의 리소스를 아끼는 앱을 만들 수 있습니다.
Frequently asked questions about Service
Android에서 service란 무엇입니까?
Service는 자체 사용자 interface 없이 background에서 작업을 수행하는 Android의 구성 요소입니다. 음악 재생, 진행 중인 길 안내, file 업로드처럼 사용자가 앱을 보고 있지 않을 때도 계속되어야 하는 작업에 사용됩니다.
Service는 AndroidManifest.xml file에 선언되어야 합니다. 기본적으로 service는 앱의 main thread에서 실행된다는 점을 알아 두는 것이 중요합니다. 따라서 무거운 작업은 여전히 background thread나 coroutine으로 옮겨야 합니다. 최신 Android 버전에는 battery를 절약하기 위해 앱이 background에서 실행될 수 있는 시점에 대한 엄격한 규칙도 있습니다.
Android에는 어떤 유형의 service가 있습니까?
Android는 세 가지 유형의 service를 구분합니다. Foreground service는 사용자가 인지하는 작업을 수행하며, 실행되는 동안 알림을 표시해야 합니다. 예를 들어 음악 재생이나 달리기 추적에 사용됩니다.
Background service는 사용자가 직접 보지 않는 작업을 수행합니다. Android 8.0부터 앱이 이러한 service를 시작할 수 있는 시점에 엄격한 제한이 있으며, 많은 작업에는 대신 WorkManager가 권장됩니다. Bound service는 activity 같은 다른 구성 요소가 bind하여 통신할 수 있게 하며, 무언가가 bind되어 있는 동안에만 실행됩니다.
Started service와 bound service의 차이는 무엇입니까?
Started service는 startService 또는 startForegroundService로 시작되며, 스스로 중지하거나 중지될 때까지 실행됩니다. 보통 특정 작업을 수행하며, 자신을 시작한 구성 요소에 결과를 직접 반환하지 않습니다.
Bound service는 다른 구성 요소가 bindService로 bind할 때 시작됩니다. Bound service는 구성 요소가 메서드를 호출하고 응답을 받을 수 있는 interface를 제공하며, 예를 들어 activity가 음악 player를 제어하는 경우가 있습니다. 더 이상 bind된 구성 요소가 없으면 중지됩니다. Service는 시작되면서 동시에 bind되면 두 가지 모두에 해당할 수도 있습니다.
언제 service 대신 WorkManager를 사용해야 합니까?
WorkManager는 앱이 닫히거나 기기가 재시작되어도 안정적으로 수행되어야 하는 background 작업을 위해 Google이 권장하는 솔루션입니다. 데이터 동기화, log file 업로드, 주기적 정리 등이 이에 해당합니다.
WorkManager는 battery와 background 활동에 관한 시스템 규칙을 준수하며, 예를 들어 기기가 Wi-Fi에 연결되어 있거나 충전 중일 때만 실행되도록 설정할 수 있습니다. Service, 특히 foreground service는 음악 재생이나 진행 중인 통화처럼 작업이 즉시 이루어져야 하고 사용자에게 보일 때 더 적합합니다. 앱이 열려 있는 동안의 짧은 작업에는 coroutine으로 충분한 경우가 많습니다.
Foreground service는 왜 알림을 표시해야 합니까?
Foreground service는 사용자가 앱을 열어 두지 않은 동안 오랜 시간 실행되며 processor, battery, 위치 데이터 같은 리소스를 사용할 수 있습니다. 그래서 Android는 사용자가 앱이 background에서 작동 중임을 알 수 있도록 지속적인 알림을 표시하도록 요구합니다.
이는 투명성을 제공하고 사용자가 service를 중지하거나 앱을 열 수 있게 합니다. 최신 Android 버전에서 개발자는 미디어 재생, 위치, 데이터 동기화 같은 service 유형도 선언하고 관련 permission을 보유해야 합니다. Android 13부터 사용자는 알림 permission도 허용해야 하며, 이는 알림이 표시되는 방식에 영향을 줍니다.
Android는 background 작업에 어떤 제한을 둡니까?
Battery를 절약하고 사용자의 개인 정보를 보호하기 위해 Android는 background 작업에 대한 제한을 점차 도입했습니다. Android 8.0부터 background에 있는 앱은 일반적으로 일반 background service를 시작할 수 없으며, 시스템은 짧은 시간 후 이를 중지합니다.
Doze mode와 App Standby는 기기를 사용하지 않거나 앱을 거의 사용하지 않을 때 network 접근과 job을 미룹니다. 최신 버전은 foreground service에 유형과 permission을 요구하며, background에서 foreground service를 시작할 수 있는 시점을 제한합니다. Background 위치에 접근하려면 별도의 permission이 필요합니다. 따라서 background 작업은 가능하면 WorkManager로 예약해야 합니다.
Service for dummies
Android 앱의 service는 아무도 앱을 보고 있지 않을 때도 계속 일할 수 있는 일종의 보이지 않는 도우미입니다. 음악 앱을 생각해 보십시오. 노래를 시작한 뒤 홈 화면으로 돌아가 메시지를 써도 음악은 계속 재생됩니다. 이를 처리하는 것이 service입니다. 앱이 사용자가 알아야 할 일에 service를 사용하면 휴대폰은 작은 알림을 표시하여 앱이 작동 중임을 분명히 알려 줍니다. 동시에 Android는 앱이 background에서 전력을 너무 많이 쓰지 않도록 하여 battery가 더 오래 가게 합니다.