2014-04-08 20 views
20

我正在尋找應用在android應用程序中的服務。服務與Android中的線程

文檔說

A服務是可以在後臺執行長時間運行的操作,並且不提供用戶界面的應用程序組件。

我已閱讀此主題Application threads vs Service threads表示相同的服務是在後臺運行操作。

但是這裏也可以使用Thread來完成。他們和位置之間的任何差別,你應該使用它們

+2

使用線程和使用服務之間從來沒有選擇,因爲它們是必須獨立回答的不同問題。 –

+1

@ChrisStratton您能否正確地寫出您的答案 –

+1

要添加到我以前的評論中,雖然線程和服務概念通常是正交的,但IntentService類表示兩個想法的組合。 –

回答

18

服務是指獨立於Activity的運行任務,它可以讓你在後臺運行任何任務。這在主UI線程上運行,所以當你想執行任何網絡或重負載操作時,那麼你必須在那裏使用Thread

示例:假設您想在後臺每日備份即時消息,那麼在這裏您將使用Service

Threads是用於在自己的線程而不是主UI線程中運行您的任務。當你想要做一些繁重的網絡操作時,比如向服務器連續發送字節,並且它與Android組件關聯。當你的組件破壞誰開始這個,那麼你應該也停止它。

示例:爲了某種目的,您在活動中使用Thread,最好在活動破壞時將其停止。

+2

但是說你想播放音樂。這將在後臺/獨立於任何活動,所以你會使用服務的權利?但是,你是否也可以啓動一個線程來完成播放音樂而不使用服務的工作? – committedandroider

+0

我們知道線程可能導致活動泄漏,如果你不在活動上調整它的生命週期。這意味着當活動被銷燬時,如果任務沒有完成,線程仍然是活動的。所以我認爲線程與活動無關。 –

+1

@committedandroider你可以但不應該在這種情況下單獨使用線程,因爲應用程序線程在設備屏幕關閉時也會停止停止音樂。相反,您可以創建一個服務,並在其中使用工作線程,或者只需將IntentService與一個工作線程一起使用即可。 – CopsOnRoad

3
  • 顯示應用與操作依賴於應用程序上下文(取決於其活動是可見的) - 使用螺紋
  • 顯示應用與操作獨立於應用程序上下文 - 使用服務
  • 應用程序不可見 - 服務
+0

所以如果你在播放音樂,你會使用一個線程,因爲它取決於在哪些活動上 - 閃屏等? – committedandroider

+0

音樂在啓動畫面上開始和結束?線程,是的。即使是主線程也會這樣做,除非您是遠程流式傳輸(這對於持續2-3秒的啓動屏幕可能不是個好主意,因爲流可能需要更長的時間才能開始)。 –

+0

因此,如果您繼續流式傳輸音樂而不與用戶界面交互,那麼服務就像Spotify一樣? – committedandroider

-1

也許你已經閱讀過關於它們的文檔描述,我不會重複它們,而是嘗試用我自己的話來給出答案,希望它們能幫助你。

Service就像一個活動,但沒有接口。可能如果你想獲取天氣,例如你不會爲它創建一個空白的活動,爲此你將使用一個服務。

A Thread是一個線程,可能你已經從其他部分知道了它。您需要知道您無法從線程更新UI。您需要爲此使用Handler,但請進一步閱讀。

+2

難道你不能在這個例子中使用線程來獲取天氣?爲什麼你想要獲取天氣並且沒有用戶界面? – committedandroider

19

更新基於最新文檔:

Android已經包含了文檔在什麼時候應該使用服務VS主題。以下是這樣說的:

如果您需要在主線程之外執行的工作,但只有當 用戶與應用程序交互,那麼你應該 可能,而不是創建一個新的線程,而不是服務。例如, 如果您想播放一些音樂,但只有在您的活動 正在運行時,您可以在onCreate()中創建一個線程,在onStart()中開始運行 ,然後在onStop()中停止它。也可以考慮使用AsyncTask或HandlerThread,而不是傳統的Thread類。有關線程的更多信息,請參閱 「進程和線程」文檔。

請記住,如果你使用一個服務,它仍然在默認情況下,您的 應用程序的主線程中運行,所以你還是應該在服務中創建一個新的線程 如果性能密集型或阻塞 操作。

這兩種方法之間的另一個顯着的區別是,如果您的設備睡眠,線程將睡眠。而即使設備進入睡眠狀態,服務也可以執行操作。我們以兩種方法來演奏音樂爲例。

線程方式:只有當您的應用程序處於活動狀態或屏幕顯示打開時,音樂纔會播放。

服務方法:即使最小化您的應用或屏幕關閉,音樂仍可播放。從https://developer.android.com/guide/components/services.html

服務

Android Documentation - Services

+0

作爲此信息的補充,請閱讀http://stackoverflow.com/questions/15524280/service-vs-intentservice –

+1

請注意,正如第一篇文章中所解釋的那樣,Service不會在單獨的線程中運行,這意味着它如果您執行密集型CPU工作,可能會阻塞主線程。閱讀這篇文章的更多信息http://stackoverflow.com/questions/7875926/does-android-service-run-from-a-seperated-thread-instead-of-ui –

+1

請添加谷歌文檔的確切頁面鏈接這解釋了這是一個進一步閱讀筆記。 – Khay

1

參考僅僅是可以在後臺,即使用戶不與應用程序交互運行的組件。因此,只有在您需要的情況下才能創建服務。

如果您需要在主線程之外執行工作,但只在用戶與應用程序進行交互時執行,則應該創建一個新線程而不是服務。例如,如果你想播放一些音樂,但只有在你的活動正在運行時,你可以在onCreate()中創建一個線程,在onStart()中開始運行它,然後在onStop()中停止它。

請記住,如果您確實使用服務,它仍默認在應用程序的主線程中運行,所以如果它執行密集或阻塞操作,您仍然應該在服務中創建新線程。