2016-08-13 222 views
2

服務在我的主要活動中的onCreate上被調用。 該服務從Service類(不是IntentService)擴展 - 在該服務中,調用了一個線程,該線程具有無限循環 - 如果線程拋出任何異常,則關閉服務並調用該服務(由try catch塊處理)。服務被android關閉後線程是否繼續運行?

最終,由於任何原因,服務被android關閉。

請回答以下問題:

A)我的線程是否繼續運行?

.....如果是這樣,如果在將來的任何時候拋出異常,它會記得該服務嗎?

....如果不是,是否會引發異常以導致服務再次啓動? B)當關閉我的服務時,android會不會轉動我的線程?

我只是想了解當Android決定清除我的服務時,我的應用程序會發生什麼。

回答

1

只要線程正在運行,它就被認爲是「垃圾收集根」。因此,線程本身和從該線程可訪問的任何其他對象都不會被垃圾收集。如果Android框架不會干涉,具有無限循環的線程將繼續無限期地運行。由於您的線程可以「關閉」服務,因此我假定它具有對服務的引用(隱式或顯式),因此整個服務將保留在內存中。

但是,Android確實有一些方法可以監視應用程序的內存消耗,並且可以殺死應用程序以釋放內存。當Android殺死一個應用程序時,它會殺死應用程序的整個過程。當進程被終止時,所有的線程都被停止,並且與它們相關的內存被釋放,因此不會有進一步的活動發生。

看起來這是您的服務的結束,但Android提供了額外的機制來控制在這種情況下發生的情況:您可以將服務指定爲STICKY,並且Android會嘗試儘快重新啓動服務。它在this answer中詳細討論。

參考文獻:

大多數在這個答案所提供的信息是覆蓋在official Services pagejavadoc of service class

對於在另一個進程中運行的Service更復雜的場景,幾乎沒有文檔,但是那裏有很多博客。我也寫了一篇關於這個問題的文章:How to establish a reliable (crash and kill tolerant) connection to bound IPC (e.g. AIDL) Service in Android

+0

非常感謝你,這正是我想知道的:)你確定聽起來像你知道你的東西。我可以問問這是記錄在哪裏嗎?不是因爲我認爲你的錯,但是我有很多問題 - 並且自己查看它會更容易:P – AndroidStudent

+0

@AndroidStudent,不用客氣。我在答案的末尾添加了幾個參考 – Vasiliy

+0

非常感謝 - 非常有幫助:) – AndroidStudent

相關問題