새소식

android studio

[android] android service?

  • -

1. Service란? 

서비스란, 안드로이드 4대 컴포넌트 중 하나이며,

사용자에게 인터페이스를 제공하지 않고 백그라운드에서 오래 실행되는 작업을 수행할 수 있는 애플리케이션 구성 요소

다른 애플리케이션 구성 요소가 서비스를 시작할 수 있고, 다른 앱을 전환하더라도 백그라운드에서 계속 실행된다.

또한 앱 구성요소와 서비스를 바인딩하여 서비스와 상호작용 할 수 있고, 프로세스 간 통신(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()

서비스가 파괴될 때 호출된다. 이 메소드에서 리스너 및 리시버 제거, 리소스 정리를 해 주어야 한다.

 

 


 

-> 서비스 구현 예제 참고 동영상 

https://www.youtube.com/watch?v=PIDL7ZD5E_w 

 

 

 

 

 

 

'android studio' 카테고리의 다른 글

[android] setValue() , postValue()  (1) 2023.08.09
[android] Handler & Looper  (0) 2023.07.24
[android] ViewBinding vs DataBinding ?  (0) 2023.07.12
[android] ViewModel란?  (0) 2023.07.09
[android] Livedata란? (feat.ViewModel)  (0) 2023.07.09
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.