[Android] Service란?

D.O·2023년 5월 11일

What is Service

Service는 안드로이드 4대 컴포넌트 중 하나이며 사용자와 상호작용하지 않고 백그라운드에서 오래 실행되는 작업을 수행할 수 있는 애플리케이션 구성 요소이다.

서비스의 종류

Service의 종류로는 Foreground Service, Background Service, Bound Service로 나눌 수 있다.

  • Foreground Service : 서비스가 수행하는 동작을 사용자에게 알릴 때 사용, Notification을 통해 서비스가 실행되고 있음을 알려준다. 예를 들어 음악 플레이어의 경우 현재 재생중인 음악 등의 정보를 Notification에 표시한다. Foreground Service는 활성화된 액티비티와 동일한 우선순위를 가지므로 시슽메에 메모리가 부족하더라도 강제 종료될 확률이 낮다.
  • Background Service는 사용자에게 보이지 않는 백그라운드 작업을 수행하며, 시스템 리소스가 부족할 경우 강제 종료될 수 있다. API 25 이상부터는 앱이 Foreground에 있지 않을 때 백그라운드 서비스를 강제로 종료 시킨다.
  • Bound Service는 IBinder라는 인터페이스로 서버-클라이언트 관계처럼 서비스와 상호작용한다. 여러 프로세스에서 같은 서비스에 바인딩하여 작업 수행 가능하며, 프로세스 간 통신 (IPC)을 수행 할 수 있다. Bound Service는 여기에 바인딩된 컴포넌트들이 전부 바인딩 해제되면 서비스가 소멸 된다.

Service의 생명 주기

  • onCreate() : 서비스가 처음 생성되었을 경우 onStartCommand() 혹은 onBind()가 호출되기전에 호출된다. 서비스가 이미 실행중일 경우 이 메소드는 호출 x

  • onStartCommand() : 시스템에서 액티비티와 같이 다른 컴포넌트에서 startService()를 호출하게 되면 이 메소드가 실행되고 서비스가 시작된다. 이 메소드를 구현한 후 서비스를 중단하기 위해 stopSelf()나 stopService() 메소드를 호출해야 한다. 바인딩만 할 경우 해당 메소드 구현할 필요 x

    onStartCommand()의 return 값으로는 아래와 같다.

START_NOT_STICKY: 시스템이 서비스를 onStartCommand()를 반환 후에 중단시키면 서비스를 재생성 하면 안됨. 서비스가 불필요하게 여러개 생성되는 것을 막을수 있는 방법

START_STICKY: 시스템이 onStartCommand() 반환 후에 서비스를 중단하면 서비스를 자동으로 다시 생성하고 마지막 인텐트는 전달하지 않음.

START_REDELIVER_INTENT: 시스템이 onStartCommand()를 반환 후에 서비스를 중단하는 경우, 서비스를 다시 생성하고 이 서비스에 전달된 마지막 인텐트로 onStartCommand()를 호출하면 모든 보류 인텐트가 차례로 전달

(즉시 재개되어야 하는 작업을 수행할 때(예: 파일 다운로드)에 적합

  • onBind(): 안드로이드의 구성요소가 서비스에 바인딩하고자 하는 경우, 이 메소드가 호출

시스템에서 액티비티와 같이 다른 컴포넌트에서 bindService()를 호출하게 되면 이 메소드가 실행되고 서비스에 바인딩됩니다. 이 메소드의 구현체에서는 IBinder를 리턴하여 클라이언트와 서비스가 통신할 수 있는 인터페이스를 제공해야 합니다. 항상 이 메소드를 구현해야 하며, 바인딩을 원하지 않으면 null을 반환하는 식으로라도 구현해야 합니다

Service를 사용할 때 주의할 점

Manifest에 서비스를 activity와 유사하게 등록을 해주어야 한다.

profile
Android Developer

0개의 댓글