2012-10-15 21 views
1

當我點擊通過我的應用程序導航,我覺得Android是每個我推出新的意向時創建活動的新實例(使用下面的代碼):根據我讀過這是什麼應該在內存分析器中顯示Android活動的多個實例嗎?

Intent intent = new Intent(this, HomeActivity.class); 
startActivity(intent); 

似乎是默認行爲。我會猜到這意味着堆現在將分配多個實例來維護應用程序的歷史記錄。然而Patrick Dubroy在他的video on Memory management中說,除非存在內存泄漏,否則只有一個活動的實例應該顯示在堆轉儲中。

我的問題是雙重的:我是否更正每次啓動意圖時都會創建一個新的活動實例?如果是這樣,在堆轉儲中出現多個實例是否表明存在內存泄漏?

更新 基於the Tasks and Back Stack guide

因爲在後面堆棧中的活動永遠不會重新排列,如果您的應用程序允許用戶從一個以上活動的一個新的實例啓動特定活動活動被創建並被推入堆棧(而不是將任何先前的活動實例置頂)。

Intent intent = new Intent(this, HomeActivity.class); 
startActivity(intent); 

那麼,事實上,Android將創建:因此,在應用程序中一個活動可能如果在你的應用程序,你這樣做是多次實例化(甚至從不同的任務)

+0

您有泄漏,您可能會持有一個引用自身引用活動上下文的引用,例如,您在活動中創建的位圖以及其他位置的引用。如果你這樣做,你會泄漏整個活動。 Android不會爲您的活動創建2個實例。 – Simon

+0

當你說「Android不會創建你的活動的2個實例」時,你真正的意思是什麼?因爲唯一的方式就是內存泄漏,如果Android正在創建另一個實例(否則保持引用不會有問題)。你真正說的是我的第一個實例應該被銷燬? – Shawn

+0

我剛測試過一個全新的應用程序。沒有引用,沒有位圖,除了「Hello world」文本之外的活動中沒有任何內容。在兩次空白活動之間來回切換幾次之後,堆轉儲會爲每個活動顯示多個對象,根據Patrick的視頻所說,這對我來說非常混亂。 – Shawn

回答

3

一個HomeActivity的新實例,並將其放在活動堆棧的頂部。這會導致多個實例HomeActivity。如果這不是你想要的(這可能不是你想要的),那麼有幾種可能的方式來處理這個問題。

因爲我不知道你的應用程序,你沒有發佈任何代碼或任何東西,我需要做一些假設。我將假設您的HomeActivity是您用來啓動應用程序的第一個活動(也稱爲根活動)。我還會假設HomeActivity開始其他活動,不會在啓動其他活動時自己致電finish()

Intent intent = new Intent(this, HomeActivity.class); 
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
startActivity(intent); 

假設HomeActivity在清單與android:launchMode="singleTop"定義,這將:

如果是這樣的話,那麼你可以從任何活動中您的應用程序通過這樣做回你HomeActivity導致活動堆棧中的所有活動(包括HomeActivity)完成並將創建HomeActivity的新實例作爲堆棧中的唯一活動。

如果你想只刪除所有活動除了現有實例的HomeActivity,就回到該實例,你需要這樣做:

Intent intent = new Intent(this, HomeActivity.class); 
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
startActivity(intent); 

這將導致在活動堆棧的所有活動(HomeActivity)將完成並將調用onNewIntent(),然後在您現有的HomeActivity實例上調用onResume()

如果我的假設是不正確的,請糾正我,我可以建議其他的事情。

+0

感謝您的詳細解釋。你是否認爲將這些標誌添加到任何意圖通常被認爲是一個好主意,除非你有明確的理由不這樣做? – Shawn

+0

絕對不是!您可以使用特定的Intent標誌來實現特定的行爲。在你的情況下,你想返回一個你知道在活動棧中的現有活動,並且你想刪除可能存在的任何未完成的活動。但在大多數情況下,這不是必需的。當你想改變默認的標準行爲時,你應該只設置意圖標誌,這應該不是經常需要的。 –

+0

我明白了。這實際上是清除後面的歷史,這不是真正的理想行爲。我的導航並不存在於主屏幕上,所以我不想每次都將用戶返回到主屏幕。所以,我的問題的答案似乎是肯定的,每次啓動活動時都會創建一個新實例。並且該實例將被添加到歷史堆棧中。 – Shawn

相關問題