0

我工作的一個機器人項目,其他一些開發商和bug已被提出,其中實例的狀態並沒有被保留在垃圾收集:savedInstanceState記憶影響

實際的錯誤報告:

的應用程序有一個活動與一堆碎片。如果在開發人員選項中選中「不保留活動」,並且用戶單擊任何更改可見碎片的按鈕,然後導航離開應用然後返回,則會將應用重新啓動到原始狀態而不是最後一個狀態。

在該項目的另一個開發提出了以下關注:

「情況下的保存會導致內存大小的應用程序,以臃腫 目前,由於可繪量,該應用程序的內存大小 太高。

如果應用程序在一段時間內沒有被用戶使用後重新啓動,那麼它很好。「

我的理解是,savedInstance包實際上被寫入物理內存,這是不正確的?上述報價是否有效?

回答

3

我的理解是savedInstance Bundle實際上被寫入物理內存,這是不正確的嗎?

我正在將「寫入物理內存」解釋爲「寫入文件系統中的文件」(又名「持久」)。

實例狀態Bundle未被保留。 Android 5.0+爲您提供了一個PersistableBundle的不同掛鉤,,因此存活並重啓。

但是,實例狀態Bundle跨進程邊界傳遞到核心OS進程。如果您的流程終止,那麼可以使用該數據,但用戶在您的任務仍在(例如,通過最近任務列表)時返回到您的應用程序。

以上報價是否有效?

該報價是可以合理地被人在這裏評價了做的唯一的一塊是:

實例的儲蓄將導致應用程序的內存大小臃腫

保存Bundle中的一個字節會消耗比在Bundle中保存零字節更多的內存。因此,在數學上,報價是準確的。關鍵是保持Bundle小。無論如何,由於其他原因,它們不能太大(IPC電話的1MB限制)。小實例狀態Bundles不應該是一個問題。

+0

在數學上說保存實例狀態會導致應用程序膨脹你的數學解決方案是草率概括的謬誤,因爲一個字節不會膨脹。 – danny117 2014-11-14 18:38:07

0

正確編碼的saveinstance狀態在一段時間內將在後臺存活數週,並且不需要超過幾個字節,最壞的情況是幾k的RAM。

你的其他開發者有一個學習曲線問題。

InstanceState保存您需要重新創建應用程序當前查看用戶的方式。我們用一個tic tac toe比喻。你有九個職位。每個位置都是xo或空白。而且你可以節省誰是它。一個十字符串不會在這裏膨脹,這不是火箭科學。

InstanceState在屏幕上有10個可繪製的應用程序。您將drawables保存爲外部存儲器,如jpg甚至bmp。然後,將可繪製的名稱保存在instanceState中。 1000個字符的實例狀態不會膨脹,這是計算機科學1k重新啓動一個非常複雜的應用程序。

SaveinstanceState不是膨脹的軟件它的一個真棒應用程序。