Bound Service Overview

Greenddoovie·2022년 1월 1일
0

안드로이드

목록 보기
5/8

구글 공식문서 - Bound Service Overview를 읽고 해석한 글

이 글을 통해 알게된 사실, service는 bindService가 호출되었을 때도 실행이 가능하다. 다시 말해 boundService는 실행중인 service에 연결이 되는 것 뿐만아니라 실행 중이지 않은 service를 실행시킴으로써 연결될 수도 있다.
그리고 boundService는 모든 client가 unbind했다해서 무조건 꺼지는 게 아니라는 점도 알게 되었다.
boundService는 호출했다해서 무조건 액티비티가 service와 연결되는 것이 아니라, ServiceConnection Class를 인자로 같이 넘겨야 bind가 된다.

궁금한 점

IBinder는 무엇인가?
구글 공식문서 - IBinder, 구글 공식문서 - Binder를 살펴보자!

번역 본

바운드 서비스는 클라이언트 서버 관점에서 서버다. 바운드서비스는 액티비티와 같은 컴포넌들이 서비스에 묶이고, 요청을 보내고, 응답을 받고, IPC를 수행하는 것을 허락한다. 바운드 서비스는 일반적으로 다른 애플리케잇현 구성요소를 서비스하는 동안에만 존재하며 백그라운드에서 무한정 실행되지 않는다.

바운드 서비스는 다른 앱이 서비스에 연결되고 상호작용할 수 있도록 허락한 서비스의 클래스의 구현체이다.
서비스 연결을 제공하기 위해서, onBind() 콜백 함수를 구현해야만 한다. 이 함수는 IBinder 객체를 반환하는데, 클라이언트가 서비스와 상호작용하기위 사용할 수 있는 인터페이스를 프로그래밍하는 것을 정의한 객체다.

시작되어있는 서비스에 연결

개발자는 실행되고 연결된 상태를 갖는 서비스를 만들 수 있다. startService를 호출해서 서비스를 시작하고, 서비스가 무한하게 실행하도록 한 후, bindService를 호출해서 서비스에 연결되는 것을 허락할 수 있다는 의미이다.

두 가지 상태를 다 갖도록 허락한다면, 서비스가 실행되어져있을 때, 모든 클라이언트가 연결이 해제되어도 시스템은 서비스를 파괴하지 않는다. 대신에, 명시적으로 stopSelf() 혹은 stopService() 함수를 호출해 멈춰야한다.

비록 개발자가 대개 onBind, onStartCommand 둘중 하나만 구현할지라도, 때때로 둘다 구현해야할 필요가 있다. 예를 들면, 음악 플레이어는 서비스가 유한하게 실행되고 결합을 제공하는것을 허락하는 것이 유용하다는 것을 알게 될 것 이다. 액티비티는 음악을 재생하기 위해 서비스를 실행할 수 있고 음악은 유저가 앱을 떠난다하더라도 계쏙 재생된다. 그럼ㄴ, 유저가 앱으로 되돌아왔을 때, 액티비티는 플레이 조종 권한을 다시 얻기 위해 서비스에 결합할 수 있다.

시작된 서비스에 연결될 때에 대한 서비스 생명주기가 궁금하다면 https://developer.android.com/guide/components/bound-services#Lifecycle

사용자는 bindService를 호출해서 서비스에 연결한다. 연결되었을 때, Service Connection의 구현을 제공해야만 한다. 이것은 서비스 연결을 관찰한다. bindService()의 반환 값은 요청된 서비스가 있는지 여부와 고객이 해당 서비스에 접근할 수 있는지 여부를 나타낸다. 안드로이드 시스템이 클라이언트와 서비스 사이에 연결을 만들 때, ServiceConnection에서 onServiceConnected를 호출한다. onServiceConnected 함수는 IBinder 인자를 포함하고, 사용자는 boundservice와 의사소통하기 위해 IBinder를 사용한다.

개발자는 동시에 한 서비스에 다양한 사용자를 연결시킬 수 있다. 하지만 시스템은 IBinder 서비스 읭사소통 채널을 잡는다. 다른 말로하면, 시스템은 오직 첫 고객이 결합될 때 IBinder를 생성하기 위해 서비스의 onBind()함수를 호출한다. 그러고나서 시스템은 같은 서비스에 연결하는 추가적인 사용자에게 onBind를 호출하지 않고 같은 IBinder 객체를 전달한다.

마지막 유저가 서비스로부터 연결을 끊었을 때, 서비스가 startService에 의해 호출된 것이 아니라면 서비스를 파괴한다.

개발자의 boundService 구현의 가장 중요한 부분은 onBinde() 콜백 함수를 반환하는 인터페이스를 정의하는 것이다. 이어지는 글은 몇가지 다른 방법을 알려주는데, 다른 방법이라 하면 IBinder 인터페이스를 정의하는 방법을 의미한다.

서비스에 연결

앱 컴포넌트는 bindService 함수를 호출하여 서비스에 연결할 수 있다. 안드로이드 시스템은 서비스의 onBind 함수를 호출하고, 서비스와 상호작용하기 위한 IBinder 객체를 반환한다.

결합은 비동기적이고 bindService()는 즉시 IBinder를 클라이언트에 반환하지 않고 즉시 반환한다. IBinder를 받기 위해서는, 클라이언트는 Service Connection 객체를 반드시 생성해야하고 bindSerivce()에 넘겨주어야한다. ServiceCoonection은 시시틈이 IBinder를 전달하기 위해 부르는 콜백함수를 포함하고 있다.

따라서,
1) ServiceConnection 구현
- onServiceConnected
- onServiceDisconnected
2) bindService 호출할 때 serviceConnection 객체 전달
3) 시스템이 onServiceConnected 호출하면 서비스 사용 가능
4) 서비스 연결 종료 원하면 unbindService() 호출

profile
기초를 이해하면 세상이 다르게 보인다

0개의 댓글