-
Android Service안드로이드 학습/Android 기술면접 대비 2023. 6. 12. 09:49
차례 : 1. Service란? 2. Service와 Thread의 차이점 : 3. Service 종류 4. Service 생명주기 5. Intent Service란? 6. Service vs IntentService
안드로이드 기술 면접 질문들을 인터넷에서 찾다가 (Android) Service vs IntentService, 이 두부분의 차이점을 설명해 보라는 질문에서 턱 막혔다.
Service 부분도 학습을 했으나 잊어버린 부분도 있기 때문에 Intent Service와 같이 정리할겸 정리해본다.
1. Service 란??
- Service는 백그라운드 작업을 위한 애플리케이션 구성 요소이다.
- Service는 독자적인 생명주기를 가지고 있다. (Activity나 Fragment와는 다른 생명주기를 가지고 있다.)
- startService() 메서드를 호출하여 Service를 시작하고, stopService() 메서드를 호출하여 Service를 중지할 수 있다.
- Service는 main Thread에서 실행되기 때문에, 오랜 시간이 걸리는 작업을 수행할 때는 스레드를 따로 만들어서 이용해야 한다. ( Android 4대 컴포넌트들은 모두 Main Thread에서 실행된다. )
같은 4대 컴포넌트중 하나인 Activity가 사용자에게 직접 보이는 화면이라면 Service 사용자에게는 보이지 않는 곳에서 필요한 작업을 수행한다.
Service를 사용되는 상황
- 음악을 재생
- 화면 공유
- 파일 입출력을 수행
- 네트워크 통신 등등
2. Service와 Thread의 차이점 :
Service
- Main Thread에서 작업을 수행한다.
- 안드로이드의 컴포넌트 중 하나이다.
- 독자적인 생명주기를 가지고 있다.
- UI 없이 Background에서 실행된다.
Thread
- 자체 Thread에서 작업이 수행된다. (Thread가 생성되면 Main Thread가 아닌것이다.)
- 안드로이드 컴포넌트가 아니라 OS 수준의 기능이다.
- Activity의 생명주기에 따라 실행되고 꺼지기 때문에 Application이 종료되면 같이 종료된다.
Thread는 안드로이드 컴포넌트가 아니므로 독자적인 생명주기도 없을 뿐더러 앱을 나가면 프로세스가 유지되지 않는다. 또, 만약에 OOM Killer에 의해서 프로세스가 종료되면 다시 재시작 될 것이라는 보장도 없다.
Service는 독자적인 생명주기를 가지고 있고 Main Thread에서 동작하기 때문에 사용자가 앱을 나가도 프로세스가 유지된다. 만약 강제로 프로세스가 죽을 경우 다시 살아날 수도 있다.
Thread는 앱이 활성화 되어 있을때 가벼운 작업을 동시에 실행하기 위해 사용한다. 메모리 공간과 자원을 공유하기 때문에 통신이 간단하며, UI 업데이트, 네트워크 요청 등 짧은 작업에 적합하다.
반면 서비스는 사용자가 앱과 상호작용하지 않을 때도 백그라운드에서 실행할 수 있는 구성 요소이며, 음악 재생, 파일 다운로드, 알림 처리 등 오래 걸리는 작업에 적합하다.OOM Killer 란?
더보기OOM Killer(Out of Memory Killer)는 리눅스 운영 체제에서 동작하는 기능 중 하나입니다.
이 기능은 시스템이 메모리 부족 상태에 빠졌을 때 사용됩니다. 메모리 부족 상태는 주로 다른 프로세스가 많은 양의 시스템 메모리를 소비하여 발생할 수 있습니다.
리눅스는 가용한 메모리가 부족한 경우에 대비해 특정 프로세스를 강제로 종료하여 시스템의 안정성을 유지하고 전체 시스템의 동작을 계속할 수 있도록 하는데, 이 역할을 하는 것이 OOM Killer입니다.
OOM Killer는 일반적으로 다음과 같은 상황에서 활성화됩니다.
- 메모리 부족: 시스템이 사용 가능한 물리적 또는 가상 메모리의 한계에 도달하면 OOM Killer가 활성화됩니다.
- OOM 점수: 각 프로세스에는 OOM 점수가 할당되며, 이는 프로세스가 종료될 가능성을 나타냅니다. OOM Killer는 이 점수를 기반으로 어떤 프로세스를 종료할지 결정합니다.
- OOM 점수 계산: 프로세스가 메모리를 많이 사용하면 그에 따라 OOM 점수가 높아지며, OOM Killer는 가장 높은 점수를 가진 프로세스를 선택하여 종료합니다.
OOM Killer의 목적은 전체 시스템이 다운되지 않도록 메모리 부족 상태에서도 적절한 대응을 할 수 있도록 하는 것입니다. 그러나 때때로 OOM Killer가 잘못된 프로세스를 종료할 수 있어, 이를 방지하기 위해 특정 프로세스에 대한 OOM 스코어 조정 및 관리가 필요할 수 있습니다.
3. Service 종류: (a) foreground, (b) background, (c) bound
(a) 포그라운드(foreground) 서비스 :
- 포그라운드 서비스는 사용자에게 잘 보이는 몇몇 작업을 수행 (오디오 앱 - 노래 재생)
- Activity와 같은 중요도이기 때문에 시스템에 의해 종료 될 일이 거의 없다.
- 어플리케이션이 종료되어도 Background에서 계속 작동한다
- 포그라운드 서비스는 알람 표시해야 합니다.
- 예제 : 오디오앱, 사용자의 달리기를 기록하는 피트니스 앱(물론 퍼미션 필요), 파일 다운로드 등등
(b) 백그라운드 (background)서비스 :
- 사용자가 직접 알지 못하는 작업을 수행할 때 사용. 백그라운드 서비스는 사용자에게 직접 보이지 않는 작업을 수행.
- 시스템에서 리소스가 부족할 경우 강제로 종료 당할 수도 있다.
- Android 8.0(API 레벨 26)는 사용자 환경을 개선하기 위해 백그라운드에서 실행되면서 앱의 동작을 제한합니다.
좀더 자세한 내용
더보기학습해보니 총 3가지 상황이 있는 것 같다.
1. 앱이 Foreground에 있을때는 계속 켜저있다.
2. 앱이 Background에 있는 상황에서는 몇분후 종료
3. 앱이 완전히 꺼진 상황
Foreground 상황이라고 판단될 때
- Activity가 시작되거나 일시 중지되거나 상관없이 보이는 Activity가 있는 경우
- 포그라운드 서비스가 있는 경우
- 앱의 서비스 중 하나에 바인드하거나 앱의 콘텐츠 제공자 중 하나를 사용하여 앱에 또 다른 포그라운드 앱이 연결된 경우 예를 들어 다른 앱이 다음 항목에 바인드되어 있다면 포그라운드에 있는 것입니다.
- IME
- 배경화면 서비스
- 알림 리스너
- 음성 또는 텍스트 서비스
위의 어떤 조건에도 해당하지 않는 경우 앱은 백그라운드에 있는 것으로 간주됩니다.
Background에 있는 상황에서
- 앱이 백그라운드로 이동하더라도 몇 분 정도의 기간 동안은 앱이 서비스를 생성하고 사용하는 것이 여전히 허용됩니다
어떤 상황에서는 백그라운드 앱이 몇 분 동안 임시 허용 목록에 들어가기도 합니다. 앱이 허용 목록에 있는 동안에는 제한없이 서비스를 시작할 수 있으며, 백그라운드 서비스도 실행이 허용됩니다. 사용자에게 보이는 다음과 같은 작업을 앱이 처리하는 경우 이 앱이 허용 목록에 들어갑니다.
- 우선순위가 높은 Firebase 클라우드 메시징(FCM) 메시지 처리
- SMS/MMS 메시지와 같은 브로드캐스트 수신
- 알림에서 PendingIntent 실행
- VPN 앱이 포그라운드로 승격되기 전에 VpnService 시작
즉각 적인 실행을 요구하는 작업은 Foreground service를 사용하고, 예약된 작업은 알림매니저나 워크매니저를 사용한다.
(c) 바운드(bound) 서비스 :
- Bound Service는 IBinder라는 앱 내에서 서비스를 사용하여 간단한 클라이언트 - 서버 환경을 구성함.(컴포넌트와 서비스간 상호작용)
- 예를 들면 Activity - 클라이언트 역할을 하고, 서비스 - 서버 역할을 할수 있다.
- 액티비티는 서비스에 어떠한 요청을 할수 있고, 서비스로부터 어떠한 결과를 받을수 있습니다.
- 여러 프로세스에서 같은 서비스에 바인딩하여 작업 수행 가능하며, 프로세스 간 통신 (IPC)을 수행 할 수 있다. Bound Service는 여기에 바인딩된 컴포넌트들이 전부 바인딩 해제되면 서비스가 소멸 된다.
더보기1. 음악 재생 애플리케이션:
음악 재생 애플리케이션에서는 바운드 서비스를 사용하여 음악 재생 관련 로직을 처리할 수 있습니다. 클라이언트 액티비티에서 바운드 서비스에 바인딩하여 음악을 재생하거나 일시정지하는 등의 작업을 수행할 수 있습니다. 또한, 서비스는 백그라운드에서 계속해서 음악을 재생하고 액티비티와 통신하여 재생 상태 등의 정보를 제공할 수 있습니다.
포어그라운드에서도 노래 재생이 사용된다는데 헷갈려서 chat gpt에 무슨 차이인지 찾아봤다.
요약하자면, 포어그라운드 서비스는 사용자에게 노래 재생 정보를 알리고 상호작용할 수 있는 인터페이스를 제공하며, 바운드 서비스는 음악 재생과 관련된 작업을 처리하고 클라이언트와 효율적인 통신을 담당합니다.
2. 위치 추적 애플리케이션:
위치 추적 애플리케이션에서는 바운드 서비스를 사용하여 위치 정보를 추적하고 이를 애플리케이션의 다른 구성 요소와 공유할 수 있습니다. 클라이언트 액티비티에서 바운드 서비스에 바인딩하여 실시간 위치 업데이트를 받을 수 있고, 위치 추적 서비스는 백그라운드에서 지속적으로 위치 정보를 수집하고 필요한 경우 클라이언트에게 알림을 보낼 수 있습니다.
3. 인터넷 라디오 애플리케이션:
인터넷 라디오 애플리케이션에서는 바운드 서비스를 사용하여 오디오 스트리밍 및 관련 작업을 처리할 수 있습니다. 클라이언트 액티비티에서 바운드 서비스에 바인딩하여 라디오 스트림을 재생하거나 일시정지하는 등의 작업을 수행할 수 있습니다. 서비스는 백그라운드에서 지속적으로 오디오 스트림을 가져오고 클라이언트에게 스트림 상태를 알릴 수 있습니다.
(d) Foreground Service와 Background Service와의 차이점 :
Background Service 스마트폰의 메모리 상황에 따라 메모리가 부족하다면 안드로이드 시스템에 의해서 무작위로 종료 당할 수도 있다.
반면에 Foreground Service 는 활성화된 Activity 와 동급의 우선순위를 가집니다. 그래서 메모리가 부족하더라도 안드로이드 시스템 의해 종료될 확률이 적다.
Foreground Service는 사용자에게 현재 해당 Service가 켜져있음을 알림을 통해 알려주고 대신 App이 종료되도 명시적인 종료가 없으면 종료하지 않는다.
Background Service는 알림을 필요로 하지 않는 대신 App이 포어그라운드에 없을 경우 종료된다.
안드로이드 Priority
더보기안드로이드에서는 우선순위라는 것이 존재한다.
만약 안드로이드에서 메모리가 부족할 경우 우선순위가 낮은 것 부터 강제로 종료 시킨다.
Foreground Service는 Activity와 같은 중요도를 갖고 있으며 아래 그림에서 보면 Foreground Process에 위치한다.
그래서 앱에서 종료 시키는 것이 아니라면 계속 켜져있을 것이다.
4. Service 생명주기
onStartCommand 와 onBind 로 나뉘게 된다.
onStartCommand 부분 (foreground, background service)
1. onCreate()
- 서비스가 생성될 때 최초로 호출됨, 초기 설정을 수행
2. onStartCommand()
- Service가 시작될 때 startService()로 호출. startService()를 통해 전달한 Intent를 onStartCommand() 에서 서비스가 수신
- onStartCommand()호출을 한 번이라도 받은 서비스는 lifecycle을 직접 관리 및 중단해야 한다. (이후 onBindCommand()가 호출 되었더라도) 시스템이 서비스를 중단하거나 소멸시키지 않음
- 종료 방법 : (1) stopSelf()를 호출하여 스스로 중단, (2) 다른 컴포넌트가 stopService() 를 호출하여 중단
3. onDestory()
- Service가 해지될 때 호출 됨. 리소스 해지를 수행
onBind 부분 (bound service)
1. onCreate()
- 서비스가 생성될 때 최초로 호출됨, 초기 설정을 수행
2 onBind()
- bindService() 로 클라이언트가 Service에 binding될 때 호출됨.
3 onUnbind()
- 모든 클라이언트들이 unbindService()를 호출해서 binding이 해지되었을 때 호출 됨.
4 onRebind()
- unbindService()가 호출된 이후에, 클라이언트가 bindService()를 호출하여 Service에 binding될 때 호출됨.
- 이미 unbind 되었던 액티비티가 다시 서비스에 연결했을 때 호출된다
5. onDestory()
- Service가 해지될 때 호출 됨. 리소스 해지를 수행
-- onStartCommand의 경우 --
- Activity 같은 앱 컴포넌트가 startService()를 호출하면, 서비스는 실행되면(started), 그 서비스를 실행한 컴포넌트가 종료되도 할 일을 모두 마칠 때까지 서비스는 종료되지 않는다.
- 따라서 서비스가 할일을 다하여 종료시키고 싶다면, 서비스 내에서 stopSelf()를 호출하여 스스로 종료되도록 하거나, 다른 컴포넌트에서 stopService()를 호출하여 종료시켜한다.
- 액티비티 등의 앱 컴포넌트는 startService()를 호출함으로써 서비스를 실행할 수 있고, 이때 어떤 서비스를 실행할지에 대한 정보와 그 외에 서비스에 전달해야할 데이터를 담고 있는 인텐트를 인자로 넘길 수 있습니다. 그리고 서비스의 onStartCommand() 콜백 메소드에서 매개변수로 그 인텐트를 받게 됩니다.
-- onBind의 경우 --
- startService() 메소드 대신 bindService() 메소드를 통해 시작되는 서비스를 서비스 바인딩 (Service Bind 혹은 Bound Service) 라 한다.
- 마치 클라이언트-서버 와 같이 동작을 하는데 서비스가 서버 역할을 한다.
(액티비티는 서비스에게 어떠한 요청을 할 수 있고, 서비스로부터 요청에 대한 결과를 받을수 있음)
- 하나의 서비스에 다수의 액티비티 연결 가능하며, 서비스 바인딩은 연결된 액티비티가 사라지면 서비스도 소멸된다. (즉 백그라운드에서 무한히 실행되지는 않음)
- 클라이언트가 서비스와의 접속을 마치려면 unbindService() 를 호출한다.
결론: 서비스가 돌아가는 동안 지속적으로 액티비티와 커뮤니케이션 하기 위해 사용
5. Intent Service란?
IntentService는 Service를 상속받은 클래스로, 백그라운드에서 작업을 수행하는 데 특화된 컴포넌트입니다.
IntentService는 작업을 수행하기 위해 큐(Queue)를 사용하며, 한 번에 하나의 작업만 처리합니다. IntentService는 모든 작업이 완료되면 자동으로 종료됩니다.
6. Service vs IntentService
1. 작업 처리 방식:
- Service: Service는 기본적으로 메인 스레드에서 실행됩니다. 오래 걸리는 작업을 하기 위해 Thread를 추가하려면 Service안에서 개발자가 별도의 스레드를 생성하여 백그라운드에서 작업을 처리해야 합니다.
- IntentService: IntentService는 백그라운드 스레드에서 작업을 처리하는 것이 목적입니다. 내부적으로 자체 스레드를 생성하고, 작업을 순차적으로 처리합니다.
Service와 IntentService의 가장 큰 차이점은 작업 처리 방식입니다. Service는 개발자가 직접 스레드를 생성하여 백그라운드 작업을 처리해야 하지만, IntentService는 작업을 자동으로 스레드를 생성하여 큐에 저장하여 작업을 처리합니다
IntentService는 이미 자체 Thread를 가지고 있고 Service는 main Thread에서 돌아가기 때문에 긴 작업을 할 경우 새로 Thread를 만들어줘야 한다.
2. 수명 주기:
- Service: Service는 한 번 시작되면 계속 실행되며, Service를 명시적으로 중지 시키기 전까지 계속해서 백그라운드에서 동작합니다.
- IntentService: IntentService는 작업을 모두 처리한 후 자동으로 종료됩니다. 모든 요청이 순차적으로 처리되므로, 작업이 완료되면 서비스가 자동으로 중지됩니다.
IntentService는 모든 작업이 완료되면 자동으로 종료되므로 명시적으로 종료해야하는 Service보다 좀더 편리 할수도 있다.
3. 요청 처리 방식:
- Service: Service는 onStartCommand() 메서드를 사용하여 클라이언트로부터 받은 요청을 처리합니다.
- IntentService: IntentService는 onHandleIntent() 메서드를 사용하여 각각의 요청을 처리합니다. IntentService는 요청을 순차적으로 처리하며, 다음 요청은 이전 작업이 완료된 후에 처리됩니다.
4. 사용 용도:
- Service: Service는 주로 백그라운드에서 지속적인 작업을 처리하기 위해 사용됩니다. 예를 들어, 음악 재생, 네트워크 요청, 위치 추적 등
- IntentService: IntentService는 비교적 간단하고 짧은 작업을 처리하는 데 적합합니다. 예를 들어, 파일 다운로드, 데이터베이스 작업 등등
'안드로이드 학습 > Android 기술면접 대비' 카테고리의 다른 글
Activity와 Fragment 그리고 생명주기 (0) 2023.06.12 ANR이란 (0) 2023.06.12 Android 런타임 ART 및 Dalvik (0) 2023.06.05 안드로이드 참고할한 링크들 (0) 2023.05.29 ViewHolder (RecyclerView & ListView) (0) 2023.05.25