1. Service 란?
Service
는 안드로이드 4대 컴포넌트 중 하나이며 사용자에게 인터페이스를 제공하지 않고 백그라운드에서 오래 실행되는 작업을 수행할 수 있는 애플리케이션 구성 요소
다른 애플리케이션 구성 요소가 서비스를 시작할 수 있고, 다른 앱을 전환하더라도 백그라운드에서 계속 실행됩니다. 또한 앱 구성요소와 서비스를 바인딩하여 서비스와 상호작용 할 수 있고, 프로세스 간 통신(IPC)도 실행할 수 있습니다.
2. Service 종류
포그라운드 서비스: 알림창을 통해 서비스가 실행중인 것을 나타내줍니다. 대신, 시스템에 의해서 강제종료 당하지 않습니다.
백그라운드 서비스: 사용자에게 보이지 않고 작업을 수행합니다. 대신, 시스템에서 리소스가 부족할 경우 강제종료 당할 수 있습니다.
(API 26(오레오) 이상 부터는 앱이 포그라운드에 있지 않을 때 백그라운드 서비스를 강제로 종료시킵니다. 그러므로, 즉각적인 실행을 요구하는 작업에는 포그라운드서비스
를, 예약된 작업일 경우는 알람매니저
, 워크매니저
를 사용하셔야 합니다.)
바인드 서비스: 안드로이드의 구성요소가 서비스에 바인딩 하여 상호작용 할 수 있습니다. 바인딩된 서비스는 클라이언트-서버 인터페이스를 제공하여 구성 요소가 서비스와 상호작용하게 하며, 결과를 받을 수도 있고 심지어 이와 같은 작업을 여러 프로세스에 걸쳐 프로세스 간 통신(IPC)으로 수행할 수도 있습니다. 여러 개의 구성 요소가 서비스에 한꺼번에 바인딩될 수 있지만, 모든 구성요소에서 바인딩이 해제되면 해당 서비스는 소멸됩니다.
위에서 다른 서비스들과 바인드 서비스를 별도로 설명했지만, 한 서비스에서 bindService()와 startService()를 전부 실행 가능합니다. 즉, startService()로 무한히 실행하게 하고, bindService()를 통해서 앱의 구성요소에서 통신하게 할 수 있습니다. 단, 이 경우 모든 구성요소에서 바인드가 해제되더라도 서비스가 종료되지 않으므로, 반드시 stopService() 혹은 stopSelf()를 통해 서비스를 종료시켜주어야 합니다.
3. Service의 생명주기
4. Service의 콜백 메소드
백그라운드 서비스
onCreate()
: 서비스가 처음 생성되었을 경우 onStartCommand() 혹은 onBind()가 호출되기 전에 실행됩니다. (서비스가 이미 실행중인 경우 실행되지 않음)
onStartCommand()
: startService()로 실행되었을 경우 onCreate() 이후 실행됩니다. 이 메소드가 실행되면 백그라운드에서 무한히 실행되므로, 반드시 stopSelf() 혹은 stopService()로 서비스를 종료시켜야 합니다. 바인딩 서비스만 이용하는 경우 이 메소드를 사용하지 않아도 됩니다.
-> onStartCommand()의 return 값
START_NOT_STICKY: 시스템이 서비스를 onStartCommand()를 반환 후에 중단시키면 서비스를 재생성 하면 안됨. 서비스가 불필요하게 여러개 생성되는 것을 막을수 있는 방법.
START_STICKY: 시스템이 onStartCommand() 반환 후에 서비스를 중단하면 서비스를 자동으로 다시 생성하고 마지막 인텐트는 전달하지 않음. (대신 Intent로 null 반환) 단, 서비스를 시작하기 위한 보류 인텐트가 있는 경우는 예외
START_REDELIVER_INTENT: 시스템이 onStartCommand()를 반환 후에 서비스를 중단하는 경우, 서비스를 다시 생성하고 이 서비스에 전달된 마지막 인텐트로 onStartCommand()를 호출하면 모든 보류 인텐트가 차례로 전달 됨. (즉시 재개되어야 하는 작업을 수행할 때(예: 파일 다운로드)에 적합함.
onDestroy()
: 서비스가 종료될 때 이 메소드가 반환됩니다. 서비스에 등록된 리소스들을 정리하는 작업들을 이 메소드에서 여기서 구현해주면 됩니다.
startService()
: 서비스를 실행하고자 할 때 사용합니다.
stopService()
: 서비스를 종료하고자 할 때 사용합니다.
바인드 서비스
onCreate()
: 서비스가 처음 생성되었을 경우 onStartCommand() 혹은 onBind()가 호출되기 전에 실행됩니다. (서비스가 이미 실행중인 경우 실행되지 않음)
onBind()
: 안드로이드의 구성요소가 서비스에 바인딩하고자 하는 경우, 이 메소드가 호출됩니다. 이 메서드를 구현할 때에는 클라이언트가 서비스와 통신을 주고받기 위해 사용할 인터페이스를 제공해야 합니다. 이때는 IBinder를 반환하면 됩니다. 이 메서드는 항상 구현해야 하지만, 바인딩을 허용하지 않으려면 null을 반환해야 합니다.
onRebind()
: (onUnbind()가 true일 경우) unBind()된 후에 서비스가 다시 실행될 경우 호출됩니다.
onUnbind()
: unBindService() Service 호출 시 true가 호출 됩니다.
bindService()
: 서비스에 바인딩하고자 할 때 사용합니다.
unBindService()
: 서비스를 언바인딩하고자 할 때 사용합니다.
(ServiceConnection 콜백 메소드)
onServiceConnected()
: 서비스에 바인딩 되었을 때 호출됩니다.
onServiceDisconnected()
: 서비스와 바인드 된 구성요소가 중단되거나 예기치 않게 서비스와 연결이 끊어졌을 때 호출됩니다. unBind()를 통해 호출되었을 경우는 호출되지 않습니다.
5. Manifest 등록
<manifest ... >
...
<application ... >
<service android:name=".service.ExampleService" />
...
</application>
</manifest>
android:export 특성을 포함하고 이를 false로 설정하면 서비스를 본인의 앱에만 사용 가능하게 할 수 있습니다. 이렇게 하면 다른 앱에서 본인 앱의 서비스를 시작하지 못하게 하며, 명시적 인텐트를 사용하는 경우에도 문제없이 적용됩니다.