2017-04-18 77 views
-1

我知道服務在後臺運行。我之前使用過Service類,並且知道它的相關方法。但是,我的問題涉及與在後臺運行服務相對應的內部操作。服務如何在Android內部運行?

從文檔:「請注意,與其他應用程序對象一樣,服務在其託管過程的主線程中運行。」

我還檢查了這個問題:How does a service runs in the background - Android

這是否意味着UI線程將繼續工作,並執行該服務是應該做任務?這可以看作是在「應用程序的背景」中運行由於應用程序任務默認在主線程上運行,並且服務將在沒有UI的情況下在該線程上運行?這個詞是否正確?或者,「在操作系統的背景下運行」更正確?

如果我使用服務(不是IntentService),然後在該服務中啓動一個新線程,它也會被視爲在應用程序的後臺運行,或者該線程將運行在不同的進程中,並被視爲在操作系統的後臺運行?

如果有人能幫助我理解這個概念,我將不勝感激。

謝謝

回答

1

不要以爲它是UI線程。把它看作主線程。活動是在主線程上運行並具有UI的對象。他們在主線程上更新這些UI。他們有一個複雜的生命週期,基於在屏幕上或不在屏幕上。服務是沒有UI的對象。他們有一個簡單的生命週期,基於啓動和停止。因此,即使其他應用擁有屏幕,它們也會堅持(除非停止)。

這些東西都與線程無關。如果需要,任何一種類型的對象都可以啓動線程,但除非這樣做,否則所有處理都將在應用程序的主線程上發生。

+0

謝謝你的回答。但是文檔中術語「背景」是什麼意思,它是應用程序還是操作系統的背景?或者,它只是表明它沒有UI?另外,如果一個服務啓動一個線程,該線程會運行在應用程序的進程中還是運行在另一個進程中?謝謝。 – Dania

+0

默認情況下,所有服務都處於同一進程中,因此服務啓動的所有線程都將處於同一進程中。您可以在單獨的進程中啓動服務,但這樣做可以接受一些限制(例如需要通過aidl使用IPC綁定到它)。如果你這樣做,它將有自己的主線程與應用程序的其餘部分分開。但不建議,除非你知道你爲什麼這麼做。文檔中的背景意味着「不顯示UI」,並表示無論屏幕上顯示的內容如何,​​它都會繼續運行。 –

+0

太好了,非常感謝你的幫助。 – Dania