2013-07-19 31 views
1

我想盡量減少我的應用程序中的內存使用情況,我正在做的一件事是在onPause方法中調用finish()(我知道這不是最好的方法)。大多數情況下,它似乎運行良好,但是當用戶點擊下一個活動的後退按鈕時,它會邏輯地跳過完成的活動並返回更遠。是否有可能在後面的堆棧中有該活動,並且如果用戶按下回來就可以重新創建該活動?完成活動onPause但仍然在後臺?

+0

爲什麼你真的需要它?你有'OutOfMemoryError'問題嗎?單獨的「活動」最多佔用幾千字節的記憶。 –

回答

2

不可以。此結論來自the task and backstack documentation以及activity documentation以及對stack data structure如何工作的一般理解。

一個堆棧數據結構只有2個可能的操作push/put,它向集合中添加了一些東西,pop可以刪除它。 Stacks展示了最後一個先出模型,或者LIFO,最後添加的東西 - 在你的情況下是一個活動 - 是在調用pop時刪除的第一個東西。

在android生命週期內,當按下後退按鈕時,活動通常會從堆棧彈出。此時onDestroy()被調用並且活動被刪除(您可以通過覆蓋onDestroy()方法並記錄結果來驗證這一點,如果你想檢查的話)。替代地,您可以通過致電finish()按照原樣強制onDestroy()。以有效的方式完成一項活動與按回相同。該活動被破壞,必須重新創建才能被添加到堆棧中。

對於你要做的事情,堆棧必須包含一些中間狀態,其中一個活動不存在,而是類似於引用的東西被保存,當移動到頂部時,將指示相應的活動應該重新創建。由於這不是麻袋的作用方式 - 它只是保存活動 - 該狀態不存在,所以你所談論的結果是不可能的。

1

不,我不認爲這是可能的。一旦完成活動,它就消失了。但是,您可以實施並處理您自己的堆棧。按下後,您將再次啓動關閉的活動。

+0

同意 - 你可以創建自己的結構,它可以保持添加活動的原始順序,也可以通過意圖重新創建先前被銷燬的那些結構。 – Rarw

+0

問題是重新創建確切的活動狀態。例如。如果用戶在EditText中輸入了文本,則當您返回到此活動時,不希望此文本消失。 – SimonSays

+0

你可以通過savedInstaceState或SharedPreferences來實現嗎? – Rarw

2

你的目標是減少內存使用,只是利用活動的生命週期的,你可以這樣做選擇(如果需要)

- 只是離開的onCreate()方法空白。(只做setContentView(佈局))

--verride onResume();

- 無論你在onCreate中做什麼,只需將粘貼複製到onResume()。

-and在的onPause()回收所有位圖並將其設置爲null(我覺得你這就是使用位圖,爲什麼你對此非常謹慎)。和刪除您的意見。

現在會發生什麼,當您啓動您的新活動時,onPause()將被調用。這將刪除您的所有位圖和視圖。當你回來時,onResume()將被調用。(onCreate不會被調用)。這將再次初始化您的視圖和位圖。

+0

我應該null所有的ImageViews?或ImageViews自動回收位圖? – StackOverflowed

+0

圖像視圖不會回收位圖。你必須通過bitmap.recycle()來回收你的位圖。 –

相關問題