사용자에게 인터페이스를 제공하지 않고 백그라운드에서 오래 실행되는 작업을 수행할 수 있는 애플리케이션 구성 요소
다른 애플리케이션 구성 요소가 서비스를 시작할 수 있고, 다른 앱을 전환하더라도 백그라운드에서 계속 실행된다.
또한 앱 구성요소와 서비스를 바인딩하여 서비스와 상호작용 할 수 있고, 프로세스 간 통신(IPC)도 실행할 수 있다.
2. Service는 언제 사용할까?
• 액티비티와 상관 없이 백그라운드에서 동작하는 component • 서버로부터 contents(파일) 다운로드 • 음악 재생 • DB에 저장 • Wi-Fi, BLE 연결
등등
3. Service 종류
포그라운드 서비스: 알림창을 통해 서비스가 실행중인 것을 나타내준다. 시스템에 의해서 강제종료 당하지 않는다. 예를 들어 카카오톡 PC 버전을 실행하면 친구와 채팅할 수 있는 채팅창이 화면에 나타난다. 이렇게 앞에 나타나있는 상태를 의미한다.
백그라운드 서비스:사용자에게 보이지 않고 작업을 수행한다. 대신, 시스템에서 리소스가 부족할 경우 강제종료 당할 수 있다. 예를 들어, 카카오톡 PC 버전에서 친구와 채팅을 하다 채팅창을 끄고 다른 작업을 수행해도 상대방에게 채팅이 오면 알림창이 나타나는데 이런 상태를 백그라운드 서비스라고 한다. 눈앞에 보이지 않아도 계속 뒤에서 실행되고 있는 상태이기 때문이다.
바인드 서비스: 안드로이드의 구성요소가 서비스에 바인딩 하여 상호작용 할 수 있습니다. 바인딩된 서비스는 클라이언트-서버 인터페이스를 제공하여 구성 요소가 서비스와 상호작용하게 하며, 결과를 받을 수도 있고 심지어 이와 같은 작업을 여러 프로세스에 걸쳐 프로세스 간 통신(IPC)으로 수행할 수도 있습니다. 여러 개의 구성 요소가 서비스에 한꺼번에 바인딩될 수 있지만, 모든 구성요소에서 바인딩이 해제되면 해당 서비스는 소멸됩니다.
service 생명주기
앞서 세가지 종류의 서비스에 대해 알아보았는데, 이를 다시 두개의 그룹으로 묶어서 분류하면
독립적으로 실행되는 started 서비스(포어그라운드, 백그라운드)와 Bound 서비스로 나눌 수 있다.
두 그룹의 차이점은 서비스안에 onStartCommand() 메소드와 onBind() 메소드중 어느걸 구현해서 사용하냐는 것이다.
onStartCommand() : 서비스를 독립으로 사용할 때 호출, startService() 함수에 의해 호출된다.
onBind() : 서비스를 Bound로 사용할 때 호출, bindService() 함수에 의해 호출된다.
서비스와 커뮤니케이션 하는 방법은 서비스의 종류에 상관없이 동일하게 Intent를 이용하면 된다.
4. Service 구현 기초 ( 간단히 보고, 코드 구현하면서 익히자)
서비스를 구현하는 방법은 Service클래스를 상속받으면 된다. 그리고 몇몇 콜백들을 구현해야 한다.
* 아래 네가지 콜백들은 서비스에서 가장 중요한 콜백
onStartCommand()
앱의 다른 구성요소에서 서비스를 실행하면 이 함수가 호출된다. 이 함수는 startService() 함수가 호출되면 호출된다. 앞서 말한것 처럼 독립적인 서비스가 필요할 때 구현해야 한다.
startService()로 서비스를 호출했다면 stopSelf() 메소드나 stopService() 함수가 호출될 때 까지 서비스는 계속 살아있다.
stopSelf() : 서비스가 스스로 중단한다.
stopService() : 다른 구성 요소가 서비스를 중단한다.
<onStartCommand()의 return 값>
START_NOT_STICKY: 시스템이 서비스를 onStartCommand()를 반환 후에 중단시키면 서비스를 재생성 하면 안됨.
서비스가 불필요하게 여러개 생성되는 것을 막을수 있는 방법.
START_STICKY: 시스템이 onStartCommand() 반환 후에 서비스를 중단하면 서비스를 자동으로 다시 생성하고 마지막 인텐트는 전달하지 않음. (대신 Intent로 null 반환) 단, 서비스를 시작하기 위한 보류 인텐트가 있는 경우는 예외
START_REDELIVER_INTENT: 시스템이 onStartCommand()를 반환 후에 서비스를 중단하는 경우, 서비스를 다시 생성하고 이 서비스에 전달된 마지막 인텐트로 onStartCommand()를 호출하면 모든 보류 인텐트가 차례로 전달 됨. (즉시 재개되어야 하는 작업을 수행할 때(예: 파일 다운로드)에 적합함.
onBind()
bindService() 함수를 호출할 때 호출된다. Bound 서비스를 사용하고 싶다면 반드시 구현해야 한다.
이 메서드를 구현할 때에는 클라이언트가 서비스와 통신을 주고받기 위해 사용할 인터페이스를 제공해야 합니다. 이때는 IBinder를 반환하면 된다. 만약 binding을 허락하고 싶지 않다면 null을 리턴
onRebind(): (onUnbind()가 true일 경우) unBind()된 후에 서비스가 다시 실행될 경우 호출됩니다.
onUnbind(): unBindService() Service 호출 시 true가 호출 됩니다.
bindService(): 서비스에 바인딩하고자 할 때 사용합니다.
unBindService(): 서비스를 언바인딩하고자 할 때 사용합니다.
(ServiceConnection 콜백 메소드)
onServiceConnected(): 서비스에 바인딩 되었을 때 호출됩니다.
onServiceDisconnected(): 서비스와 바인드 된 구성요소가 중단되거나 예기치 않게 서비스와 연결이 끊어졌을 때 호출된다. unBind()를 통해 호출되었을 경우는 호출되지 않는다.
onCreate()
서비스가 생성될 때 한번만 호출된다. 순서는 onStartCommand()와 onBind()보다 앞선다.
onDestroy()
서비스가 파괴될 때 호출된다. 이 메소드에서 리스너 및 리시버 제거, 리소스 정리를 해 주어야 한다.