2011-12-28 44 views
1

我有數據庫清理,我需要在正在運行的服務線程內完成。在正常情況下,當服務完成並調用onDestroy()時會發生這種情況。重新安裝/更新應用程序正在運行的服務會發生什麼情況?

我注意到,如果我重新安裝或更新應用程序,而該服務正在運行,該服務沒有調用onDestroy()。無論如何,我的應用程序可以在下次啓動時知道它是重新安裝後的第一次運行,因此它可以完成對數據庫的一些清理工作?

爲了澄清,再次簡單地運行該服務將不會做我所需要的。在很多情況下,我的服務是由廣播接收者開始的,而不是由活動本身開始的,所以我不能依靠onPause進行主要活動。我無法弄清楚如何知道這個服務是否已經運行,或者是被無聲地殺死並需要清理。

我想澄清一下,因爲其他人似乎誤解了。首先,在重新安裝或更新應用程序的情況下,onDestroy不會發生。由於應用程序未卸載,共享首選項也不會重置。其次,谷歌特別聲明,你不能依靠onDestroy,所以要求我快速找到解決方法,而不是問谷歌爲什麼onDestroy無法正常工作也不太合理。有關活動,請參閱關於onDestroy的API文檔。服務文檔不會重複該警告,但顯然它是成立的。我發現的唯一工作解決方案是我從另一個StackOverflow線程下面發佈的工作解決方案。

+0

如果您的服務沒有正常中止,並且在重新安裝應用程序後未調用onDestroy(),我覺得非常困惑。也許最好是讓Google瞭解一下這個話題,而不是找到解決這個問題的快速解決方案? – harism 2011-12-28 21:36:52

+0

@Harism,Google不保證onDestroy會被調用。事實上,在API文檔中,他們聲明:「有些情況下系統會在不調用該方法(或任何其他方法)的情況下簡單地終止該活動的託管過程,因此不應該用於執行旨在保留過程結束後「。特別是如果你重新安裝/更新應用程序,無論正在運行會被殺死並且onDestroy不會被調用。根據文檔,唯一保證被調用的事件是onPause,並且服務沒有該事件。 – 2011-12-30 23:39:25

+0

沒錯。但個人而言,我發現它並不像Service.onPause()方法那樣調用Service.onPause(),而是因爲沒有Service.onPause()方法而調用Activity.onPause()被調用的含義模糊的藉口。事實上恰恰相反,Service.onDestroy()明確聲明在從它返回之前進行適當的清理。如果谷歌不關心可能丟失的資源,並且只依靠殺死這個過程,那就完全不同了。 – harism 2011-12-31 00:28:25

回答

0

啊哈,我發現這裏的答案: How to check if a service is running on Android?

有了這個小片段。只需傳遞一個當前上下文給它,所以如果來自BroadcastReceiver傳遞給定onReceive的上下文,例如...通過這個,我可以在服務啓動時設置全局變量,並在onDestroy中清除它。當我的應用程序啓動時,如果設置了變量,我可以測試以查看服務當前是否正在運行,如果不是,則可以進行清理。

private boolean isMyServiceRunning(Context context) { 
    ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); 
    for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) { 
     if ("com.myapp.myservice".equals(service.service.getClassName())) { 
      return true; 
     } 
    } 
    return false; 
} 
+0

您好託尼...您可以用我們的服務得出什麼結論來更新我們。它會被破壞並重新啓動,或者根本不會被銷燬 – AbhishekB 2013-08-02 13:48:23

+0

它會被破壞,但在發生時不會調用ondestroy或任何其他事件。這就是爲什麼當它啓動時設置pref var,然後在開始時檢查它是否需要從最後一次運行中清除。 – 2013-08-04 12:05:41

相關問題