3 분 소요


서비스(Service)

안드로이드 Service 클래스는 앱이 백그라운드 작업을 시작시켜 수행할 수 있게 특별히 설계되었다. 작업을 빨리 수행하고 종료하는 브로드캐스트 수신자와는 다르게, 서비스는 실행 시간이 길면서 사용자 인터페이스를 필요로 하지 않는 작업을 수행 한다. (예시: 음악을 스트리밍을 하거나, 다른앱을 사용하면서 전화를 한다.)

서 비스는 백그라운드에서 작업을 처리한다고 하였기 때문에 별도의 스레드에서 실행된다고 오해할수 있다. 하지만 서비스는 기본적으로 자신이 시작된 컴포넌트와 같은 메인 스레드 에서 실행이 되기 때문에 CPU를 많이 사용하는 작업을 서비스가 실행을 해야한다면 새로운 스레드에서 수행되어야 한다.

  • 백그라운드 에서 작업을 하는 컴포넌트이다.
  • 서비스는 시작된 컴포넌트와 같은 메인 스레드 에서 실행된다.

크게 나누게되면 서비스는 두가지로 나눌 수 있다.

  • 스타트 서비스
    • 포그라운드
    • 백그라운드
  • 바운드 서비스

작게는 서비스에는 세가지의 유형으로 나눌 수 있다.

  • 포그라운드
  • 백그라운드
  • 바운드

포그라운드

포그라운드 서비스는 사용자에게 보이는 작업 을 실행한다. 예를 들어 음악을 듣게 된다면 이는 포그라운드 서비스로 알림을 표시해야 한다. 서비스이기 때문에 사용자와 상호작용을 하지않아도 계속 실행이 된다.

백그라운드

백그라운드 서비스는 사용자에게 보이지 않는 작업 을 실행한다. 공식 홈페이지에서는 앱이 스토리지와 관련된 기능을 수행하는 서비스를 사용한다면, 보통 그것은 백그라운드 서비스라고 한다.

참고 : 앱이 API 레벨 26 이상인 경우, 앱 자체가 포그라운드에 있지 않을 때 시스템이 백그라운드 서비스 실행에 제한을 건다. 이와 같은 경우 앱은 예약된 작업(scheduled job)을 사용해야한다.

바운드

바운드 서비스는 자신을 시작시킨 컴포넌트와의 상호작용을 허용하고 그 결과를 받을 수도 있다. 상호 작용을 위해 바운드 서비스는 bindService() 를 통하여 앱 구성 요소를 서비스에 바인딩할 수 있다.

바인딩된 서비스는 바인딩한 구성 요소와 상호작용 을 하면서 요청을 주고 결과를 받을 수 있게 되는 클라이언트-서버 구조 를 제공한다. 또한 IPC(프로세스 간 통신) 의 구현을 통해서 이러한 상호작용이 프로세스 간에도 일어날수 있다. 또한 동시에 여러 컴포넌트가 한 서비스에 바인딩될 수 있다.

바인딩한 서비스가 더 이상 필요로 하지 않을 떄는 unbindService 함수를 호출하여 바인딩을 해제할 수 있고 모든 구성 요소가 서비스에서 바인딩을 하제하면 해당 서비스는 안드로이드 런타임 시스템에 의해 종료된다.

바운드 서비스는 onBind() 함수의 구현을 포함한다. 이 함수는 서비스가 최초로 생성 될 때 그리고 그 이후에 다른 구성 요소가 해당 서비스에 바인딩 할 때 자동 호출 된다. 이 함수의 목적은 바인딩한 컴포넌트에 IBinder 타입의 객체를 반환한다.

  • 바운드 서비스 요약
    • 바인딩을 통하여 구성 요소와 상호작용을 한다.
    • bindService() 함수를 통하여 서비스에 바인딩한다.
    • onBind() 함수를 통하여 IBinder 타입의 객체를 반환한다.

서비스 생명주기

서비스는 안드로이드 Service 클래스의 서브 클래스로 생성된다. 그리고 생성되는 서비스의 특성에 따라 다음의 콜랙 함수를 오버라이딩해야 한다.

  • onCreate() - 서비스가 생성될 때 호출되며, 이 함수가 호출된 이후 다음에 onStartCommand() 함수가 호출되거나 onBind() 함수가 최초 호출된다.
  • onStartCommand() - 다른 컴포넌트가 startService() 함수를 호출하여 서비스를 시작시킬 때 호출된다.(바운드 서비스의 경우 구현할 필요가 없다)
  • onBind() - 컴포넌트가 bindService() 함수를 호출하여 서비스에 바인딩할 때 호출된다. 바인드 서비스를 구현할 때는 이 함수에서 IBinder 객체를 반환해야 한다. 이 객체는 서비스가 클라이언트와 통신할 때 사용한다. 스타트 서비스의 경우는 이 함수에서 null 값을 반환하도록 구현해야 한다.
  • onDestroy() - 서비스가 소멸될 때 호출된다.

소멸된 서비스 재시작 옵션 제어

서비스 클래스에서 오버라이딩한 onStartCommand() 콜백 함수는 정수값을 반환해야 한다. 이것은 안드로이드 런타임 시스템에 의해 서비스가 소멸될 경우에 서비스를 어떻게 할 것인지 정의를 하는 값이다.

  • START_NOT_STICKY - 처리 대기 중인 인텐트가 없다면 서비스가 소멸될 때 다시 시작하지 말라고 시스템에게 알려 준다.
  • START_STICKY - 만일 onStartCommand() 함수의 실행이 끝나고 복귀한 이후에 서비스의 소멸이 일어나면 서비스가 소멸된 후 가능한 빨리 다시 시작되어야 한다 는 것을 나타낸다.
  • START_REDELIVER_INTENT - 만일 onStartCommand() 함수의 실행이 끝나고 복귀한 이후에 서비스의 소멸되었다면 현재의 인텐트 를 onStartCommand() 함수에 다시 전송 하여 해당 서비스가 다시 시작되어야 한다는 것을 나타낸다. 그리고 그다음에 처리 대기 중인 인텐트가 전달된다.

Manifest 파일에 서비스 선언

서비스가 사용될 수 있으려면 Manifest 파일에 선언이 되어야 한다. 이에 적합하게 구성된 <service> 요소를 <application> 항목에 추가하면 된다.

.
.
.
    <application
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name">
            <service
                android:name=".MyService">
            </service>
    </application>

기본적으로 서비스는 public으로 선언된다. 즉, 서비스가 있는 앱 패키지 외부의 컴포넌트가 액세스 할 수 있다는 의미이다. 서비스를 private으로 만들려면 android:exported 속성을 false로 선언해야 한다.

<service 
    android:name=".MyService"
    android:exported="false">
</service>

References

맨 위로 이동 ↑

댓글남기기