在我的應用中,我有一個用於播放MP3流的音樂的服務。 我啓動它(startService())並連接到它(bindService()),所以當沒有客戶端連接時它不會停止。 如果玩家暫停,我會在一段時間後清理一些資源,如果它暫停了一段時間,我將清理幾乎所有資源,並且:如果沒有客戶端連接(活動連接),我會停止調用stopSelf( );如果連接了某個客戶端,我準備將其銷燬,設置一個布爾值,當所有客戶端斷開連接時檢查該布爾值,如果沒有連接客戶端並且此布爾值爲true,則調用stopSelf()。即使客戶端已連接,Android服務的onBind也未被調用並且正在調用onDestroy
因此,基本上,只有當(1)沒有客戶端連接到它並且(2)它已經很長時間暫停時,服務才被銷燬。
它運行良好,但我有一個問題。在onDestroy()中,我釋放所有資源並保存一些數據(如正在播放的音樂列表)。如果有很多音樂,它可能需要幾乎半秒。問題是,當我在這段時間內再次打開我的應用程序時,onDestroy()尚未返回。會發生什麼是使用同一服務的實例,並且未調用onCreate()。所以,由於資源被釋放,所以我自然會遇到一些錯誤。
這個bug很難模擬。我只能重現3次。我不知道如何繼續。我想盡可能快地從onDestroy()返回,使用另一個線程來釋放資源並保存數據,但它會使數據保存之前啓動新服務。有人知道有關在Android上銷燬/重新創建服務的更多細節嗎?我不知道哪個類管理它,所以我不知道我可以閱讀哪些代碼來更好地理解它。
在此先感謝。
更新:
我剛剛發現我真正的問題。當我的Activity斷開並重新連接時(當我關閉所有活動並再次打開應用程序時),似乎該服務的onBind未被調用。所以,我的資源更清潔(這是計劃一段時間後播放器暫停時間的計劃作業)認爲沒有客戶端連接並調用stopSelf()(我使用onBind和onUnbind方法跟蹤連接的客戶端)。而且,即使有一個客戶端連接到該服務,onDestroy()被調用。然後,我的活動保持連接到剛清理所有資源的服務。
我已經更新了問題的標題。
更新2:
只是多一點解釋。當我關閉並重新打開我的應用程序時,我的ServiceConnection實現的ServiceConnected方法在bindService之後調用,但未調用服務的onBind。看起來它確實認爲沒有客戶端連接,因爲它被破壞了,即使文檔說在所有客戶端解除綁定之前,啓動和綁定的服務都不會被銷燬。
您可以釋放資源並保存數據不在活動onDestroy方法中,而是在服務onDestroy方法中。 –
在服務onDestroy方法中,你可以開始釋放資源和保存數據,此時寫入啓動工作的地方標誌(在SharedPreferences或其他地方),然後在你的活動中檢查flag = true - 開始後臺線程和睡3秒,並再次檢查標誌。當工作完成後,您的後臺線程將重新啓動您的服務。 –
我在說的是Service的onDestroy(),而不是Activity的onDestroy()。該活動只是從服務中解除綁定。當onUnbind()被調用時,我做了我所說的驗證。 –