2013-05-22 48 views
4

Android提供了Service類,可以用於後臺或非UI操作。Android - 如果綁定活動被終止,綁定服務會發生什麼?

我對服務的生命週期有疑問。

我知道綁定服務有生命週期類似以下內容:

  1. 一些組件通過bindService啓動服務() - >的onCreate()
  2. onBind()
  3. 過程
  4. 結合組件調用unbindService() - > onUnbind()
  5. onDestroy()

我的問題是:

活動通常會在onStop()上調用unbindService()。 但是,可以在不調用onStop()的情況下終止活動 - 我的意思是,當系統內存不足時,必須調用的唯一方法是onPause()。 onStop()在onPause()之後。在調用onStop()之前,Activity可以被銷燬。

在這種情況下,服務沒有獲得unbindService(),所以服務仍在運行。這是正確的嗎?

當然,這很少發生,因爲服務默認爲後臺。 (服務更容易被內存不足的系統所殺死。)但是,「前臺」服務的優先級高於「onPause()」活動。「根據http://developer.android.com/guide/components/processes-and-threads.html。在這種情況下,綁定活動將首先被殺死。

如果發生這種情況,服務不會結束?如果內存不再低,那麼將再次創建Activity,但會再次調用bindService(),因爲它是一個新實例。此外,該活動甚至可能無法重新啓動。這不正確嗎?在這種情況下我能做些什麼?

+0

我沒有完整的答案給你的問題,但是我想指出一個前臺服務必須已經通過'startForeground()'。因此,它成爲一項開始的服務,應該能夠獨立生活。 – Joffrey

+1

如果發生以下情況:1.活動A綁定服務S. 2.活動A啓動一個對話風格的活動B(A僅稱爲onPause,A在可見過程中)。 3.活動B綁定服務S(S在前臺進程)。 4.系統內存不足,所以A死亡。 (A的onStop不叫)5. B unbinds S. – Naetmul

+0

我明白你的意思了。無論如何,我不知道Android是否真的銷燬了這樣的單個組件。關於進程和線程的Android開發人員指南指出,可能會終止整個進程來恢復內存,但我沒有看到關於殺死單個組件的任何信息。 (但當然,每個進程的重要性取決於其組件的狀態) – Joffrey

回答

5

服務被終止,但如果您從onStartCommand(...)返回'返回START_STICKY'[並且您正在使用'startService(intent)']啓動服務,則服務將重新開始備份。即使活動未再次打開,服務也將開始備份。

我運行了this example - the BoundedAudioService example並通過查殺活動進行了測試 - 服務會重新啓動。 (通過重新啓動,我的意思是,服務的onStartCommand(...)再次被調用)

+0

嘿,我使用startService並且還返回START_STICKY,但我仍然在我的logcat中得到這個錯誤,並且服務沒有得到重啓。 –

+0

謝謝...爲我工作 – Richa

相關問題