我有數據庫清理,我需要在正在運行的服務線程內完成。在正常情況下,當服務完成並調用onDestroy()時會發生這種情況。重新安裝/更新應用程序正在運行的服務會發生什麼情況?
我注意到,如果我重新安裝或更新應用程序,而該服務正在運行,該服務沒有調用onDestroy()。無論如何,我的應用程序可以在下次啓動時知道它是重新安裝後的第一次運行,因此它可以完成對數據庫的一些清理工作?
爲了澄清,再次簡單地運行該服務將不會做我所需要的。在很多情況下,我的服務是由廣播接收者開始的,而不是由活動本身開始的,所以我不能依靠onPause進行主要活動。我無法弄清楚如何知道這個服務是否已經運行,或者是被無聲地殺死並需要清理。
我想澄清一下,因爲其他人似乎誤解了。首先,在重新安裝或更新應用程序的情況下,onDestroy不會發生。由於應用程序未卸載,共享首選項也不會重置。其次,谷歌特別聲明,你不能依靠onDestroy,所以要求我快速找到解決方法,而不是問谷歌爲什麼onDestroy無法正常工作也不太合理。有關活動,請參閱關於onDestroy的API文檔。服務文檔不會重複該警告,但顯然它是成立的。我發現的唯一工作解決方案是我從另一個StackOverflow線程下面發佈的工作解決方案。
如果您的服務沒有正常中止,並且在重新安裝應用程序後未調用onDestroy(),我覺得非常困惑。也許最好是讓Google瞭解一下這個話題,而不是找到解決這個問題的快速解決方案? – harism 2011-12-28 21:36:52
@Harism,Google不保證onDestroy會被調用。事實上,在API文檔中,他們聲明:「有些情況下系統會在不調用該方法(或任何其他方法)的情況下簡單地終止該活動的託管過程,因此不應該用於執行旨在保留過程結束後「。特別是如果你重新安裝/更新應用程序,無論正在運行會被殺死並且onDestroy不會被調用。根據文檔,唯一保證被調用的事件是onPause,並且服務沒有該事件。 – 2011-12-30 23:39:25
沒錯。但個人而言,我發現它並不像Service.onPause()方法那樣調用Service.onPause(),而是因爲沒有Service.onPause()方法而調用Activity.onPause()被調用的含義模糊的藉口。事實上恰恰相反,Service.onDestroy()明確聲明在從它返回之前進行適當的清理。如果谷歌不關心可能丟失的資源,並且只依靠殺死這個過程,那就完全不同了。 – harism 2011-12-31 00:28:25