본문 바로가기
Mobile : Android/Framework

[Android Component] 서비스(Service) #1 - 개요

by 신숭이 2021. 6. 26.

 

비스(Service) #1 - 개요

 

 

 

서비스

 흔히 안드로이드 4대 컴포넌트라고 하면 액티비티(Activity), 서비스(Service), 브로드캐스트 수신자(BroadCast Receiver), 콘텐츠 프로바이더를 떠올린다.  앱을 개발할때, 액티비티는 뗄래야 뗄 수 없고 가장 많이 접하기에 익숙할 뿐더러 액티비티만 이용해서도 어떠한 앱을 완성할 수도 있다. (좋은 방법은 아니지만) 그러나 서비스는 안드로이드를 공부하는 초반에는 낯설기도 하고, 이해하기도 액티비티에 비해 직관적이지 않아 잘 쓰지않곤 했다.

 

  안드로이드 애플리케이션을 여러개 개발해보다 보니, 어떠한 기능에 대해 구현을 할때 이게 정말 최선인가? 싶은 작업들이 많았고 이런 작업에 대한 해법을 찾다보면 결국 서비스에 있는 경우가 많았다. 보통 그런 작업들은 액티비티가 작동하는 동안 별도로 무언가를 수행하는 종류의 작업이 많았다.

 

 서비스는 앱 전반에 걸쳐 어떤 도움을 주는 서포터이다 .기본적으로 백그라운드에서 수행는 구조로 UI를 제공하지 않아 눈에 보이지 않는다. 대표적인 예시로 음악 플레이어 앱은 앱의 여러 화면을 돌아다니고, 또 앱을 빠져나와도 이어폰에선 음악이 계속 나오게 한다. 또 다른 예시로는 웨어러블 기기(갤럭시 워치 등)를 통해 다른 앱을 쓰는 도중에도, 웨어러블 기기 제어 앱은 지속적으로 블루투스를 통해 우리의 신체 데이터를 수신한다.

 

 또는 일종의 서버라고 봐도 된다. 클라이언트(액티비티 등 각종 컴포넌트)가 필요로하는 요청을 인터페이스를 통해 받아 작업을 수행하고 응답을 반환하는 작업이 가능하다.

 

 

 

서비스의 특징

1. 서비스는 앱이 죽지않도록(작업이 중단되지 않도록) 도움을 줄 수있다.

 서비스의 종류에 따라, 앱의 우선순위를 높여준다. 시스템은 메모리가 부족할때, LMK(Low Memory Killer)가 우선순위가 낮은 프로세스를 종료한다. 서비스 대신 스레드를 사용하여 어떤 작업을 한다고 가정하고, 해당 스레드가 속한 프로세스가 우선순위가 낮다면 시스템은 그 작업을 멋대로 종료시킬 가능성이 있다. 그래서 서비스를 사용하여 작업 지속성을 보장한다. 이것만으로도 서비스를 사용할 이유는 분명 충분하다.

2. 서비스는 UI 스레드에서 실행된다.

 백그라운드 상에서 동작한다 하더라도, 기본적인 작업은 UI 스레드(기본 스레드)에서 실행된다. 따라서 무거운 작업은 서비스 내에서 별도로 스레드를 생성하여 진행하는게 좋다. 

 

3. 서비스는 단일 인스턴스로 실행된다.

 서비스는 앱에서 단 1개의 인스턴스만 생성되기에, 굳이 싱글톤 객체로 만들어 작업을 수행할 필요가 없다. 

 

 

 

 

서비스의 종류 : 가시성에 따른 분류

1. 포그라운드(Foreground) 서비스

 사용자에게 직접 보이는 작업을 수행한다. 포그라운드 서비스는 알림(Notification)을 표시해야 하며, 서비스 중 가장 우선순위가 높아 앱이 종료되는 경우가 거의 없다. 서비스는 백그라운드에서 돌아간다며?? 라고 할 수 있는데 간단하게 구분하자면 이건 무조건 상단바(상태창)에 알림을 띄워놔야한다. 그래서 포그라운드라 이해하고, 작업은 백그라운드에서 수행한다.

 

2. 백그라운드(Background) 서비스

 사용자에게 직접 보이지않는 작업을 수행한다. 우리가 일반적으로 이해하는 서비스이다. 뒤에서 파일 압축, 콜백 함수를 통한 통신 데이터 수신등의 작업을 수행할 수 있다.

 

 

 

 

서비스의 종류 : 성격에 따른 분류

 포그라운드&백그라운드 서비스는 콜백 메서드의 구현 또는 서비스를 실행시키는 방식에 따라 다음과 같이 분류되기도 한다. 참고로 시작된 서비스이면서 바인딩된 서비스일 수 있다. 각각의 자세한 공부는 다음 포스트에서 이어가도록 하고 지금은 간단히 개요만 쓰겠다. 생명주기에 대해서도 다음 포스트에서 이어가겠다.

 

1. 스타티드(Started, 시작된) 서비스

 어떤 컴포넌트(예: 액티비티)에서 startService() 메서드를 통해 시작한 서비스이다. 서비스에 정의된 작업을 어떤 컴포넌트가 수행하고자 할때 호출한다. 

 

2. 바인딩된(Bound) 서비스

 바인드(Bind)는 묶는 다는 뜻으로 2개이상 컴포넌트를 서로 연결해 놓는 것을 의미한다. bindService() 로 서비스를 생성한 경우가 이에 해당한다. 서버(서비스)-클라이언트(액티비티) 구조에 가장 적합한 형태의 서비스이다.

 

서비스의 생명주기

 

댓글