백그라운드에서 오래 실행되는 작업을 수행할 수 있는 어플리케이션 구성요소
서비스는 안드로이드의 4대 컴포턴트 중 하나로 사용자에게 인터페이스를 제공하지 않으면서 작업을 수행할 수 있는 구성 요소이다. 액티비티와 비교해보면 화면에 직접보이는 화면은 액티비티 보이지 않고 뒤에서 수행된다면 서비스 라고 생각할 수 있다.
다른 애플리케이션 구성요소가 서비스를 시작시킬 수 있으며 다른 어플리캐에션으로 전환되더라도 백그라운드에서 계속 실행되게 된다. 예를 들어 음악 재생, 네트워크 트랜잭션 처리 등의 작업을 백그라운드에서 수행한다.
포그라운드는 사용자에게 보이는 작업을 수행한다. 예를 들어 음악을 재생하는 등의 작업이다. 이름이 포그라운드라서 서비스가 아니라고 생각이 들수도 있지만 포그라운드 서비스는 어플이 종료되고 다른 앱을 사용중이더라고 동작할 수 있기 때문에 서비스이다. 사용자에게 계속하여 서비스가 돌아가고 있음을 알려주기 위해 알림을 제공해야 한다.
백그라운드는 사용자에게 보이지 않는 작업을 수행한다. API 26이후 버전부터는 앱이 포그라운드에 있지 않으면 백그라운드 서비스는 강제로 종료된다.
바인딩을 위한 서비스 이다. 어플리케이션 구성요소가 클라이언트, 서비스가 서버의 역할을 한다고 생각할 수 있다. 바인딩 된 서비스는 구성요소와 상호작용하여 결과를 받거나 프로세스간 통신을 수행할 수도 있다. 여러 구성요소가 서비스에 동시에 바인딩 될 수 있지만 모든 구성요소에서 바인딩이 해제되면 서비스는 소멸된다.
서비스의 생명주기는 액티비티보다는 간단하지만 서비스의 생성과 소멸 방식에 좀더 주의를 들여야 한다. 서비스는 사용자가 알지 못하는 상태로 백그라운드에서 동작하고 있을 수 있기 때문이다.
startService를 통한 호출과 bindService를 통한 호출로 구분된다. 하지만 시작된 모든 서비스는 클라이언트와 바인딩되도록 허용할 수 있기 때문에 onStartCommand로 시작된 서비스라고 하더라도 onBind에 대한 호출을 받을수 있다.
onStartCommand 또는 onBind이전에 한번만 실행되며 서비스의 초기 설정을 수행한다.
startService에 의한 서비스 호출일 경우 수행된다. 백그라운드에서 서비스가 무한히 실행되게 되므로 이후 stopService 또는 stopSelf를 통해 서비스를 종료시켜 주어야 한다.
bindService에 의한 서비스 호출일 경우 수행된다. 구현할때에 인터페이스를 제공해야 하며 IBinder를 반환한다. 항상 구현해야 하는 메소드 이며 바인딩을 하지 않는 경우 null값을 반환하도록 한다.
서비스를 소멸시킬 때 호출된다. 서비스에 남아있는 리소스를 정리하는 작업을 수행한다.
다른 구성요소들과 마찬가지로 서비스는 애플리케이션의 매니페스트 파일에 선언해 두어야 한다.
<manifest ... >
...
<application ... >
<service android:name=".ExampleService" />
...
</application>
</manifest>
name값을 필수로 주어야 하며 필요에 따라 다른 특성들을 정의해 줄 수 있다.