2010-10-21 19 views
1

我知道我的問題標題一定聽起來非常模糊。但讓我在這裏清除它。在活動被殺之前可以在onDestroy()裏面花多少時間?

說我有一箇中間件堆棧上的android應用程序。在我的活動的onCreate()中,我初始化了我的中間件模塊。

在其onDestroy()中,我必須取消初始化中間件。現在我的中間件調用可能需要一段時間才能處理。所以我想知道onDestroy()函數有多少時間,並且看看我的deinitialisation是否可以在那個時間內發生。

在onDestroy()中保留我的de-init是否合理?

另外,假設我初始化了活動A1的onCreate()中的中間件。點擊按鈕後,活動A1切換到活動A2。在低內存的情況下,LMK會殺死一段時間未使用的活動。在這種情況下,活動A1不會被殺死嗎?當活動A1被殺死時,我在A1中創建的所有實例是否也會被刪除?

問候, 奇奇

回答

4

我相信你是搞糊塗了問這個問題。

爲了得到所發生的事情的一個很好的理解,你應該看看整個生命週期的圖表,可以在developer.android.com發現:

您將看到Activity.onDestroy()僅在受控關閉活動的情況下才會被調用 - 這種情況極少發生,因爲Android操作系統可能會在各種stat中終止進程沒有打電話給你的onDestroy()方法。

什麼和爲什麼你需要去初始化?

  • 如果你擔心釋放資源,那麼當你的進程被終止時,如果你釋放資源,他們中的大多數將會被釋放。
  • 如果你擔心節省了用戶的數據(您的應用程序的狀態),那麼你應該重寫onSaveInstanceState()onRestoreInstanceState()

如果你真的想回答你的問題,那麼這就是:

  • 當它運行onDestroy()時,你的應用程序有(可能)儘可能多的時間 - 它甚至運行的事實onDestroy()意味着操作系統沒有選擇它被殺死。但是這很可能並不重要:首先,onDestroy將永遠不會在大多數應用中運行,並且如果操作系統改變了主意並決定應用必須死亡,即使它正在運行onDestroy,也會終止它。
+1

@jhominal:關於何時保存用戶數據的小記。一個人應該知道,只有當應用程序被系統殺死時,纔會調用'onSaveInstanceState()'。如果應用程序由於用戶按下後退按鈕或在您的代碼中調用了finish()而退出,它將不會被觸發。所以如果你想100%確定你保存了當前的應用程序狀態,這應該在'onPause()'中完成。 – Nailuj 2010-10-21 12:52:58

+1

另一個說明:當你說'你的應用程序有(可能)儘可能多的時間',這是不正確的。如果你的應用有足夠的時間,它可能很容易凍結整個系統。所以5秒鐘的規則依然如此。 – Nailuj 2010-10-28 08:46:01

+0

@Nailuj:該應用程序在其自己的Linux進程中運行。如果它開始在'onDestroy'方法中消耗太多資源(用戶已經離開了應用程序),這個過程將被系統毫不客氣地殺死 - 但是發生這種情況的條件應該與一定數量的消耗資源而不是特定的持續時間。 – 2010-10-28 09:06:24

3

http://developer.android.com/guide/practices/design/responsiveness.html

在Android中,針對 應用是不夠 響應一段時間的系統警衛由 顯示一個對話框,用戶, 叫做應用無響應 ( ANR)對話框

如果您的應用程序對5se不響應,ANR對話框通常會彈出conds。正如jhominal指出的那樣,onDestroy()方法可能不是您想要執行清理/保存首選項/等的地方。

無論你選擇做什麼,無論是onDestroy(),onSaveInstanceState()onPause(),我相信通用的第5條規則將適用。如果你在做什麼需要超過5秒鐘,ANR對話框將會顯示,用戶可以選擇強制關閉你的應用。

編輯: 如果您的應用程序在後臺運行,它可能是(可能?),如果你違反了5秒規則是直接殺害無ANR對話框顯示。但我不確定這一點,只是假設。

相關問題