안드로이드 서비스에 대해 알아보자

James_·2022년 4월 20일
0

서비스?

백그라운드에서 오래 실행되는 작업을 수행할 수 있는 구성 요소이며 사용자 인터페이스를 제공하지 않는다(화면에서 보이지 않는 작업을 수행)
이는 사용자가 다른 애플리케이션으로 전환하더라도 백그라운드에서 계속해서 실행된다.
이외에도 구성 요소를 서비스에 바인딩하여 서비스와 상호작용할 수 있으며 프로세스 간 통신(IPC)이 가능하다.
서비스에는 3가지 유형이 있다.

포그라운드

포그라운드 서비스는 사용자에게 잘 보이는 몇몇 작업을 수행함.
예:)오디오앱 오디오 트랙 재생시 포그라운드 서비스 사용
포그라운드 서비스는 알림을 표시해야 함

백그라운드

백그라운드 서비스는 사용자에게 직접 보이지 않는 작업을 수행함.
예:) 저장소를 압축하는데 서비스를 사용함 -> 백그라운드 서비스
안드로이드 API 26이상인 경우 앱이 포그라운드에 있지 않을 때 시스템에서 백그라운드 서비스 실행에 대한 제한을 적용함. 이와 같은 경우 대부분 앱이 예약된 작업을 사용해야함

바인드

애플리케이션 구성 요소가 bindService()를 호출하여 해당 서비스에 바인딩되면 서비스가 바인딩 되었다고함. 바인딩된 서비스는 클라이언트-서버 인터페이스를 제공하여 구성요소와 서비스가 상호작용할 수 있게 함(IPC 통신 가능). 바인딩이 해제되면 해당 서비스는 소멸됨.

주요 콜백 메서드

onStartCommand() - 다른 구성 요소(예:액티비티)가 서비스를 시작하도록 요청하는 경우 이때 startService()를 호출하는 방법을 씀. 이 메서드가 실행되면 백그라운드에서 무한히 실행될 수 있음. 바인딩만 제공하고자 하는 경우 이 메서드를 구현하지 않아도 됨.
리턴하는 정수는 시스템이 서비스를 종료할 경우 서비스를 유지하는 방법 값임.

START_NOT_STICKY - 시스템이 서비스를 onStartCommand 반환 후에 중단시키면 서비스를 재생성하면 안 됨. 전달할 보류 인텐트가 있는 경우에는 예외. 애플리케이션이 완료되지 않은 모든 작업을 단순히 다시 시작할 수 있을 때 유용함.

START_STICKY - 시스템이 onStartCommand() 반환 후에 서비스를 중단하면 다시 서비스를 생성하고 onStartCommand()를 호출하지만 마지막 인텐트는 전달하지 않음(그 대신 시스템이 null 인텐트로 onStartCommand() 호출)
명령을 실행하지는 않지만 무한히 실행중이며 작업을 기다리고 있는 미디어 플레이어에 적합

START_REDELIVER_INTENT - 시스템이 onStartCommand() 반환 후에 서비스를 중단하려는 경우, 서비스를 다시 생성하고 이 이 서비스에 전달된 마지막 인텐트로 onStartCommand() 호출, 모든 보류 인텐트가 차례로 전달됨.
즉시 재개되어야하는 작업을 눙동적으로 수행 중인 서비스(파일 다운로드)에 적합

onBind - 다른 구성요소가 해당 서비스에 바인딩되고자 하는 경우 이 메서드를 호출. 이때 bindService()를 호출하는 방법을 사용함. 바인딩을 허용하지 않으려는 경우 null을 반환하면 됨.

onCreate, onDestroy 액티비티와 마찬가지로 생명주기가 있음.

매니페스트에서 서비스 선언

<manifest ... >
  ...
  <application ... >
      <service android:name=".ExampleService" />
      ...
  </application>
</manifest>

android:exported 특성을 포함하고 이를 false로 설정하면 서비스를 본인의 앱에만 사용 가능하게 할 수 있습니다. 이렇게 하면 다른 앱이 여러분의 서비스를 시작하지 못하도록 효과적으로 방지하며, 이는 명시적 인텐트를 사용하는 경우에도 문제없이 적용됨.

서비스와 Intent서비스

Service - 기본적으로 애플리케이션의 기본 스레드를 사용하기 때문에 애플리케이션이 실행 중인 액티비티의 성능 저하를 일으킬 수 있으므로 새 스레드를 생성하는게 중요
IntentService - Service의 하위 클래스로, 작업자 스레드 사용하며 모든 시작 요청을 처리하되 한 번에 하나씩 처리함.

서비스 중단

시작된 서비스는 자신의 수명 주기를 직접 관리해야함. stopSelf()를 호출하여 스스로 중지하거나, 아니면 다른 구성요소가 stopService()를 호출하여 중지시킬 수 있음.

서비스 수명 주기

공식문서를 참고하여 정리함.

profile
Android 개발자

0개의 댓글