我想盡量減少我的應用程序中的內存使用情況,我正在做的一件事是在onPause方法中調用finish()(我知道這不是最好的方法)。大多數情況下,它似乎運行良好,但是當用戶點擊下一個活動的後退按鈕時,它會邏輯地跳過完成的活動並返回更遠。是否有可能在後面的堆棧中有該活動,並且如果用戶按下回來就可以重新創建該活動?完成活動onPause但仍然在後臺?
回答
不可以。此結論來自the task and backstack documentation以及activity documentation以及對stack data structure如何工作的一般理解。
一個堆棧數據結構只有2個可能的操作push/put,它向集合中添加了一些東西,pop可以刪除它。 Stacks展示了最後一個先出模型,或者LIFO,最後添加的東西 - 在你的情況下是一個活動 - 是在調用pop時刪除的第一個東西。
在android生命週期內,當按下後退按鈕時,活動通常會從堆棧彈出。此時onDestroy()
被調用並且活動被刪除(您可以通過覆蓋onDestroy()
方法並記錄結果來驗證這一點,如果你想檢查的話)。替代地,您可以通過致電finish()
按照原樣強制onDestroy()
。以有效的方式完成一項活動與按回相同。該活動被破壞,必須重新創建才能被添加到堆棧中。
對於你要做的事情,堆棧必須包含一些中間狀態,其中一個活動不存在,而是類似於引用的東西被保存,當移動到頂部時,將指示相應的活動應該重新創建。由於這不是麻袋的作用方式 - 它只是保存活動 - 該狀態不存在,所以你所談論的結果是不可能的。
你的目標是減少內存使用,只是利用活動的生命週期的,你可以這樣做選擇(如果需要)
- 只是離開的onCreate()方法空白。(只做setContentView(佈局))
--verride onResume();
- 無論你在onCreate中做什麼,只需將粘貼複製到onResume()。
-and在的onPause(),回收所有位圖並將其設置爲null(我覺得你這就是使用位圖,爲什麼你對此非常謹慎)。和刪除您的意見。
現在會發生什麼,當您啓動您的新活動時,onPause()將被調用。這將刪除您的所有位圖和視圖。當你回來時,onResume()將被調用。(onCreate不會被調用)。這將再次初始化您的視圖和位圖。
我應該null所有的ImageViews?或ImageViews自動回收位圖? – StackOverflowed
圖像視圖不會回收位圖。你必須通過bitmap.recycle()來回收你的位圖。 –
- 1. 完成後仍然繼續活動();
- 2. 結束()完成的活動,但它仍然是在背景
- 3. 完成活動後,android進程仍然活着
- 4. 安卓:如何從後臺活動,這仍然在後臺
- 5. 完成MapReduce作業後,RunJar仍然處於活動狀態
- 6. 查詢在完成後仍然運行
- 7. 完成調用後將活動導致OnPause()
- 8. 同步完成,但last_sync_status仍然是1
- 9. PHP - Windows後臺命令正在工作,但仍然在等待後臺進程完成
- 10. Android完成活動,然後恢復活動父項
- 11. 如何彈出對話框,但仍然能夠控制後臺活動
- 12. Android應用程序在完成活動後進入後臺
- 13. 啓動和活動完成後活動
- 14. 線程仍然runnng後摧毀活動
- 15. 即使在onHandleIntent完成後,IntentService仍會在後臺運行
- 16. 後臺自動完成
- 17. db:drop後rails仍然活着
- 18. 保存後完成活動
- 19. 開始活動,但在後臺
- 20. 找回到Android活動後,後臺線程完成
- 21. 爲什麼在完成命令後Docker-compose容器仍然存活?
- 22. Android:爲什麼在活動結束後PhoneCallListener仍然活着?
- 23. Android:啓動之前活動的新實例,然後完成
- 24. 子流程完成,但仍然沒有終止,造成僵局
- 25. gevent:I/O在超時之前完成,但超時仍然發生
- 26. WPF查看泄漏 - 隱形,但仍然在後臺呈現
- 27. setTimeLimit仍然存在函數完成
- 28. Webdriver-Jenkins,瀏覽器仍然在後臺
- 29. 窗口仍然在後臺工作
- 30. Alertdialog在點擊後仍然活着
爲什麼你真的需要它?你有'OutOfMemoryError'問題嗎?單獨的「活動」最多佔用幾千字節的記憶。 –