Simple&Natural
Service bind전 start로 먼저 시작해주어야 하는 경우 본문
내가 겪었던 문제는 아니지만 얼마 전 아는 개발자 분의 문제를 함께 해결해주면서 있었던 이슈이다.
이 부분은 예전에 채팅앱을 만들 때 서비스를 다루면서 알고 있던 부분이라 다행히 바로 찾아낼 수 있었다.
문제인즉슨, 앱이 종료 유무에 관계없이 지속적으로 카운팅이 유지되는 기능이 필요한데 앱을 껐다 키면 카운팅이 새롭게 시작되는 현상이었다.
소스코드를 부탁드리고 문제의 원인을 분석해보았다.
원인은 의외로 간단했는데 바로 카운팅 작업을 다루는 서비스를 액티비티에 단지 바인드만 시킨 것이 문제였다.
안드로이드 공식 문서에서는 다음과 같은 내용을 찾을 수 있다.
Bound
A service is bound when an application component binds to it by calling bindService(). A bound service offers a client-server interface that allows components to interact with the service, send requests, receive results, and even do so across processes with interprocess communication (IPC). A bound service runs only as long as another application component is bound to it. Multiple components can bind to the service at once, but when all of them unbind, the service is destroyed.
바인드로 서비스를 시작한 경우 해당 서비스의 모든 바인드가 해제되면 서비스는 소멸한다.
위의 이슈의 경우 앱이 종료되면서 바인드가 해지되고 서비스가 종료되는 것이 문제의 원인이었던 것이다.
아래의 설명을 하나 더 보자
Although this documentation generally discusses started and bound services separately, your service can work both ways—it can be started (to run indefinitely) and also allow binding. It's simply a matter of whether you implement a couple of callback methods: onStartCommand() to allow components to start it and onBind() to allow binding.
바인드 서비스는 특정 컴포넌트에서 서비스를 잠시 이용할 뿐 서비스를 시작하고 유지하는 것과는 별개임을 알 수 있다.
오직 바인드를 위해 잠시 서비스가 생성되고 유지될 뿐이다.
해결을 위해서는 startService를 이용하여 먼저 서비스를 독립적으로 실행한 뒤 bind가 필요한 부분에서만 호출하는 방식으로 사용하여야 한다.
++
현재 안드로이드에서는 유휴 상태의 앱에서 백그라운드 서비스를 사용하는 것을 혐오[?]하기 때문에 반드시 포어그라운드 서비스를 사용할 것.
'안드로이드(Android) > 이슈 및 해결' 카테고리의 다른 글
Android Studio 4.0 실행 시 Start Failed Error 관련 (0) | 2020.11.02 |
---|---|
Navigation Component Default BackStack 문제 (0) | 2020.10.21 |
Coroutine IO Dispatcher의 Thread number가 최대 Thread 갯수를 초과하는 이슈 (0) | 2020.09.27 |
META-INF 관련 문제가 발생하는 경우 (0) | 2020.09.15 |
안드로이드에서 웹문서 출력시 글자가 깨지는 경우 (0) | 2020.04.08 |