2011-12-02 131 views
8

我有點困惑如何服務功能,特別是這兩個東西:Android - 在Activity關閉後服務如何繼續運行?

http://developer.android.com/guide/topics/fundamentals/services.html

服務的「啓動」,當一個應用程序組件(如活動)通過調用啓動它startService()。一旦開始,服務可以無限期地在後臺運行,即使啓動它的組件被銷燬。

和:

注意:一種服務,它的宿主進程,該服務不會創建自己的線程的主線程中運行,在單獨的進程不運行(除非另有說明) 。

我的問題:

  1. 這怎麼可能,是由startService啓動的服務()生存,如果主線程活動退出?或者只有那些服務才能在主要的Activity關閉中生存,這些都在單獨的線程中?

  2. 如何在單獨的線程中啓動服務? http://developer.android.com/guide/topics/fundamentals/services.html#ExtendingService的開發文檔只顯示了一個示例,如何在創建服務時產生線程...並不是如何在新線程中產生服務本身...
    編輯:用於啓動它的manifest.xml中的android:process=在一個單獨的線程? (如果它在一個新的進程啓動它,那麼它必須在一個單獨的線程。)

+0

你能接受答案嗎?謝謝 –

+0

@Kiran我會接受,如果我的第二個問題也回答。看看我的編輯猜測如何解決它。 – sydd

+0

通常你會產生線程來分配負載。但服務本身的目的是在不干擾活動的情況下執行一些繁重的操作。回答這個問題:「你可以在一個單獨的線程上啓動一個Activity嗎?」。很可能,相同的答案也適用於服務 –

回答

6

報你,:

注意:一種服務,它的宿主進程,該服務不會創建自己的線程的主線程中運行,在單獨的進程不運行(除非你另有指定)。

當主要活動關閉時,並不一定意味着託管進程退出。根據文檔,該服務繼續運行,因爲該過程還活着!

檢查this

Android系統將試圖保持過程,只要周圍的服務已啓動或已綁定了客戶託管的服務。當在內存不足的運行,需要殺死現有流程,託管服務進程的優先級將資源所剩無幾,只有當它需要終止進程躺在附近是高

所以,你的過程會被殺死。其他。該過程將繼續保持您的服務。

+0

謝謝,這完全回答我的第一個問題。 – sydd

4
  1. 一個啓動的服務可以存活啓動它以完全相同的方式活動的關閉是一個活動可以在關閉另一個以startActivity()開頭的活動時生存下來。活動和服務只是應用程序過程的兩個獨立組件。一旦開始,每個都獨立存在。 (與綁定服務—有所不同,當沒有任何綁定服務時,系統將關閉綁定服務)。

  2. 您不能在單獨的線程中啓動服務,不能啓動活動在非事件線程中。您只能要求系統啓動服務(通過startService()bindToService())。系統始終在事件線程上啓動服務。

+0

和如果我在manifest.xml中爲我的服務指定android:process =「:remote」會發生什麼?它仍然在同一個線程? – sydd

+0

@sydd - 如果你指定一個類似的進程名稱,它確實將運行在一個單獨的線程中,因爲它將在一個單獨的進程中。但是,該服務仍然會在其他進程的事件線程中運行,因此您仍然需要編寫相應的服務(將耗時的工作放到工作線程中)。 –

+0

@Todd你確定,它會在事件線程中運行嗎?如果我用自己的'android:process'做了一個服務,並且在它的messenger的'handleMessage()'方法裏放了一個'wait(5000)',它就不會阻塞UI線程。但是,如果我刪除了'android:process'聲明,那麼wait命令會阻塞UI線程。 – sydd

相關問題