2017-10-13 45 views
1

因此,我閱讀了Android O的可怕文檔,它說,一旦應用程序在後臺,服務將會死亡,我應該重構我的代碼以使用Foreground服務或作業調度程序。Android O - 我的服務已經在後臺運行了20多分鐘了。它不應該被停止嗎?

在我的應用程序中,我將照片上傳到服務器,並且如果服務器返回500錯誤或沒有網絡連接,那麼無論應用程序處於前景還是應用程序中,我都有一項服務每隔5分鐘重試一次不。它採用了Timer這樣做

timer.scheduleAtFixedRate(new TimerTask() {

所以我升級我的手機到Android O和跑我的應用程序,把它的背景下,開設了10多個應用程序,並開始看logcat的。

現在,25分鐘後,我的服務每5分鐘繼續運行計劃的TimerTask

爲什麼它還活着,如果是這樣的話,我重構我的應用程序是否有意義?

有一個類似的問題在這裏: Android O - Background service limitation not working as expected

但得到的答覆是太神祕,尤其是說,部分「過程可能會在任何時候終止。」 - 這一直是Android的情況。這次更可能有不同程度的變化嗎?

回答

1

爲什麼還活着

也許你的服務本身是不是活的,但你的服務泄漏其Timer,和你的進程仍然活着。由於你的問題沒有明顯的代碼,我們只能猜測。

如果是這樣的話,重構我的應用程序對我有意義嗎?

是的。

這次更可能是不同程度的嗎?

是的。進程的重要性是決定哪些進程終止(以及何時)由負責終止Android SDK進程以釋放系統RAM的「OOM殺手」的關鍵指標。當您的服務運行時,您的進程只會具有更高的重要性(與普通的緩存進程相比)。 Android 8.0會停止該服務,但它不會立即終止該進程,從而允許普通的OOM殺手邏輯正常進行。從您的流程壽命的角度來看,它仍然是非確定性的,因爲它一直存在,但短壽命的可能性要大得多。

此外,從用戶的角度來看,您目前的實施並不是很好。 只有在服務正在向用戶傳遞價值時才能運行,因爲您正在捆綁系統RAM,因此用戶可能更喜歡將其用於其他用途。觀看時鐘節拍不會主動向用戶傳遞價值。

使用JobScheduler(如果你的minSdkVersion爲21或更高版本)或它周圍的兼容性包裝,如Evernote的android-job(如果你的minSdkVersion低於21)。然後,您可以擁有與以前相同的基本功能,但可以實現更好的內存管理。而且,作爲一個好處,你解決了這個Android 8.0的問題。

+0

謝謝。對我來說是21+,所以JobScheduler工作得很好。是的,我想我正在泄漏TimerTask - 它已啓動,並且再也不會再次觸摸,直到我將其取消爲止。但onDestroy現在還沒有被召喚超過50分鐘。 –

+0

btw是RAM中的整個應用程序,如果服務/進程仍在運行,因爲存在泄漏TimerTask,或者它只是這個組件被加載到內存中 –

+0

@KR:「它開始並且再也不會再次觸摸,直到onDestroy取消它「 - 好的,那麼你不會泄漏它。 「但是onDestroy現在還沒有被召喚50分鐘以上」 - 你的'targetSdkVersion'是什麼?對於'targetSdkVersion'爲26+,或者如果用戶手動要求Android爲其啓用後臺優化(僅適用於出現在「電池責任」列表中的應用程序),則大約1分鐘的服務生命週期爲'targetSdkVersion'。 「如果服務/進程仍在運行,則是RAM中的整個應用程序」 - 默認情況下,是。 – CommonsWare

相關問題