2017-10-11 152 views
1

在測試後臺執行限制here時,我在我的服務中創建了一個線程。這樣的事情:創建的後臺線程不會被Android殺死O

// spawn own thread 
HandlerThread thread = new HandlerThread("TestServiceThread"); 
thread.start(); 

該服務是由通常的奧利奧前startService開始。 我在Android設備監視器中進行調試時注意到的是,我創建的線程繼續保持長久健康並正常執行。這可以成爲一個解決方法,以防止濫用系統資源,而不是通過前臺服務或工作做事嗎?或者它只是對即將結束的框架的追逐?任何意見 ?

回答

1

我不希望改變。它不可能(不僅僅是在Android中,它在理論上是不可能的)在沒有線程幫助的情況下安全地殺死一個線程。否則,您可以在其他線程死鎖,數據不一致或應用程序可能無法正常工作的情況下終止線程。這就是爲什麼thread.stop()被棄用的原因 - 因爲沒有辦法使它安全。這就是爲什麼你中斷一個線程,而線程需要監視isInterrupted並乾淨地退出。

1

我會小心這種方法。

雖然Gabe Sechan的回答非常有效,但依靠這項工作的危險性太高,無法追求這一點。谷歌顯然希望得到任何試圖執行後臺執行和濫用用戶電池的應用程序,並且我認爲這是有充分理由的。有些應用根本不尊重用戶的電池。

的文件中明確指出:

的應用被認爲是在前臺如有以下 的是真實的:

它有一個明顯的活動,該活動是否開始或暫停。 它有一個前臺服務。另一個前臺應用連接到該應用的 ,可以通過綁定到其某個服務或通過使用其內容提供商之一 。例如,如果其他應用綁定到其IME牆紙服務 通知偵聽器語音或文本服務,則前景應用位於 前景如果這兩個 條件都不成立,則認爲該應用位於後臺。

來源: https://developer.android.com/about/versions/oreo/background.html#services

儘管這不是安全的殺死一個線程由於加布提到的所有原因,機器人很可能終止該應用完全關閉(ALA殺-9)。我會想象任何死鎖都會由Android處理(我確定這不是一件簡單的任務)。數據損壞將被視爲該應用程序的錯誤,因爲沒有正確處理後臺執行。

這對Android來說有點風險,但他們可能已經對它進行了權衡,並決定這是一條路。

而且,照顧這樣的:

注意:默認情況下,這些限制只適用於針對Android的 8.0(API級別26)或更高版本的應用程序。但是,即使該應用的目標API級別低於26,用戶也可以在「設置」屏幕中爲任何應用啓用這些限制的大部分 。

來源:https://developer.android.com/about/versions/oreo/background.html#overview

+0

我同意,所以我搬到後臺執行到需求的Android作業。 –