0

我在Android中開發的第一個應用程序涉及背景中的BLE掃描。該應用程序有兩個按鈕來啓動服務(這使得掃描和記錄結果)並停止服務。爲什麼IntentService中的BLE掃描即使在服務被破壞時也能繼續工作?

documentation我瞭解了Service和IntentService之間的區別。我懷疑使用IntentService並不是最好的方法,因爲Android系統會在處理所有傳遞的意圖時破壞服務,因此在由該服務創建的工作線程中運行的掃描也將停止工作。但是,我想嘗試測試我的知識。

正如我所期待的那樣,服務在創建後幾乎立即銷燬。但是,通知檢測到的新設備的日誌不斷出現,這意味着即使服務被破壞,掃描進程也會繼續運行。當我關閉主要活動時,掃描終於停止。我想知道爲什麼掃描過程似乎與主要活動的線程綁定,而不是由意圖服務創建的線程(自動)。爲什麼即使服務被破壞,掃描過程也能繼續工作?

我發現了一些與服務和BLE掃描相關的SO答案(herehere),但沒有人解決這個特定主題。你能給我一些幫助嗎?

+0

你能顯示你的IntentService的代碼嗎? –

回答

2

Process Priorities blog post

Android不走殺人的事情只是爲了殺人的事情着想(記住:從頭開始的東西是不是免費的!),所以這些過程有可能留周圍由於內存需求較高的類別中的任何內容需要回收一段時間,以最近最少使用次序(最早回收第一次)殺死。

因此,即使您的服務已停止,您的進程仍可以在內存中保留一段時間。由於您還沒有專門停止您的BLE掃描onDestroy,該工作將繼續進行,直到您的進程死亡以回收內存爲止。

+0

感謝您的回答。也許我不明白線程和進程之間的區別。我瞭解,即使在我的某個組件已被銷燬(例如,服務)時,我的進程仍可以保持活動狀態。但我無法理解,即使線程已被銷燬(這是服務被銷燬時發生的情況),已經被編程爲在特定線程中執行的任務如何保持執行。我將線程和進程理解爲不同的概念。 – mikemontilla

+0

根據[BluetoothLeScanner源代碼](https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/bluetooth/le/BluetoothLeScanner.java#382),它在主線程上傳遞結果 - 僅僅因爲你在'onHandleIntent'的後臺線程中註冊掃描結果不會將回調與該線程綁定。 – ianhanniballake

相關問題