0

Android에서 개발중인 첫 번째 애플리케이션에는 백그라운드에서 BLE 스캐닝이 포함됩니다. 응용 프로그램에는 서비스를 시작하는 두 개의 버튼 (검색 및 결과 기록)과 서비스 중지가 있습니다.IntentService에서 만든 BLE 검색이 서비스가 파괴 된 경우에도 계속 작동하는 이유는 무엇입니까?

documentation에서 나는 Service와 IntentService의 차이점을 알게되었습니다. IntentService를 사용하면 안드로이드 시스템이 전달 된 모든 인 텐트가 처리 될 때 안드로이드 시스템이 서비스를 파괴하고 따라서 서비스에 의해 생성 된 작업 스레드에서 실행중인 스캐닝이 작동을 멈추게 될 것이므로 최상의 접근 방법이 아닌 것으로 의심됩니다. 그러나, 나는 그것을 내 지식을 시험해보기 위해 시험해보고 싶었다.

예상대로 서비스가 생성 된 후 거의 즉시 파괴됩니다. 그러나 탐지 된 새 장치에 대해 알리는 로그는 계속 나타납니다. 이는 서비스가 파괴 된 경우에도 검색 프로세스가 계속 작동 함을 의미합니다. 주 활동을 종료하면 검사가 마침내 중단됩니다. 스캔 프로세스가 인 텐트 서비스에 의해 생성 된 스레드 (자동)가 아닌 주 활동의 스레드에 바인딩 된 것처럼 보이는 이유를 알고 싶습니다. 서비스가 파괴 된 경우에도 스캔 프로세스가 계속 작동하는 이유는 무엇입니까?

서비스 및 BLE 검색 (herehere)과 관련된 몇 가지 SO 답변을 발견했지만이 특정 주제를 다루는 사용자는 없습니다. 너 좀 도와 줄 수있어? 당

+0

IntentService 코드를 표시 할 수 있습니까? –

답변

2

Process Priorities blog post :

안드로이드는 단지 물건을 죽이는의 이익을 위해 일을 살해하지 않습니다, 그래서 이러한 프로세스는 잠재적으로 주변에 머물 수 (기억 처음부터 일을 시작하는 것은 무료로하지 않습니다!) 상위 카테고리의 메모리 요구 때문에 메모리 요구 사항으로 인해 다시 회수되기 전의 시간, 가장 최근의 사용 순서 (가장 오래된 것이 가장 먼저 회수 됨) 순으로 죽습니다.

따라서 서비스가 중지되었다하더라도 프로세스는 얼마 동안 메모리에 남아있을 수 있습니다. onDestroy에서 BLE 검색을 중단하지 않았으므로 프로세스가 종료되어 메모리가 회수 될 때까지 작업이 계속됩니다.

+0

답변 해 주셔서 감사합니다. 어쩌면 스레드와 프로세스의 차이를 이해하지 못할 수도 있습니다. 내 구성 요소 중 하나가 파괴 된 경우에도 내 프로세스가 살아남을 수 있음을 이해합니다 (예 : 서비스). 하지만 특정 스레드에서 실행되도록 프로그래밍 된 작업이 스레드가 파괴 된 경우에도 실행되는 상태를 유지할 수있는 방법을 이해할 수 없습니다 (서비스가 파괴 될 때 발생하는 현상). 스레드와 프로세스를 다른 개념으로 이해합니다. – mikemontilla

+0

[BluetoothLeScanner 소스 코드] (https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/bluetooth/le/BluetoothLeScanner.java#382), onHandleIntent' 백그라운드 스캔 결과에 등록하기 때문에 메인 스레드에서 결과를 전달합니다. 백그라운드 스레드는 콜백을 해당 스레드에 연결하지 않습니다. – ianhanniballake