2011-11-16 30 views
3

我有一個簡單的Hello World應用程序爲什麼應用程序及其資源在Android中退出後會保留在內存中?

public class TestLeaksOnFinish extends Activity 
{ 
    static int ctr = 0; 
    protected void onCreate(Bundle savedInstanceState) 
    { 
    super.onCreate(savedInstanceState); 
    TextView t = new TextView(this); 
    t.setText("Hello World! "+ctr++); 
    setContentView(t);   
    } 
} 

當我運行這個多次,每次依次按下BACK,我看到的點擊率,每次增加,表明該活動尚未完全殺死後返回。

這也可以通過在按BACK鍵後在DDMS中轉儲HPROF文件來確認。
該文件仍包含我的TestLeaksOnFinish活動類。

有人可以解釋爲什麼在按下BACK之後,此活動仍存在於堆轉儲中嗎?

當我列出傳入引用,我得到以下 screenshot from DDMS

+1

當按下後退鍵時,你確定調用了finish()嗎?也許Android只是暫停應用程序並在之後恢復。此外,'ctr'是一個靜態字段 - 它們以泄漏而聞名。 –

+0

靜態原語不會泄漏活動 – FunkTheMonk

+0

@MichellBak finish()被調用(這是onBackPressed()的默認實現,但我只是爲了確定而忽略它)。 onPause和onDestroy也被調用。另外,如果我讓ctr不再是靜態的,我會在堆轉儲中獲得相同的數據。當多次運行應用程序時,ctr本身始終爲零,表示每次都會創建一個新實例(如預期的那樣),這仍然讓我想知道爲什麼舊的實例會保存在內存中,因爲它不再被使用。 –

回答

11

在Android中的活動不被殺掉他們就會被移動到background.That的Android是如何工作的,你不能殺死一個應用程序或基本沒有不是退出如你所知。它只會留在背景和記憶中。

當內存不足時,系統會根據系統爲每個應用程序本身提供的優先級開始中止應用程序進程。

+0

當我的應用程序包含服務,內容提供者等時,我理解這種一般行爲。但是,在我的示例中,我只有一個完成的活動,並且(特別是在移除靜態時)活動不再被重用(另一個該活動將在重新啓動時創建),所以我很驚訝地看到堆轉儲仍包含對我的活動的引用。 –

+0

這就是Android系統的行爲聽起來有點令人驚訝,但每當你習慣了它,你就會發現它實際上應該是這樣。 –

+0

下面或多或少是正確的:在Android中,應用程序由活動,內容提供者和服務組成;它**是**可能殺死(= finish())一個Activity,但不可能殺死/退出整個應用程序。因此,即使最後一次活動完成,Android仍會保留對應用程序的引用。此引用恰好是我的(已完成)活動。 –

相關問題