ViewPager以這種方式工作:假設它有n頁面或片段。如果您在索引i,則Android將確保碎片i-1和i + 1並且它們的視圖被實例化。當你從一邊到另一邊翻頁,根據內存和「不要保留活動」設置,你將繼續實例化片段,直到所有片段出現在內存中。當你從一邊到另一邊時,Android使用OpenGL平滑地滑動一個片段的視圖到屏幕上,同時滑動另一個片段。
與其他一些答案相反,Android不會而不是當ViewPager啓動時實例化所有碎片 - 實例化是懶惰的。除了上述默認行爲外,您還可以使用setOffscreenPageLimit()
控制內存使用。
這與舊版活動堆棧模型的關鍵區別僅在於調用時實例化活動。
有幾種後果:
- 當ViewPager首先顯示,則CPU將更加活躍因爲它已經以實例化片段被示出和那些離屏的左側和右側( 2x或3x等效工作)
- 由於所有片段都保留在內存中,所以內存使用將會(略高)。如果你的碎片沒有使用太多的內存,那麼內存使用的差異是微不足道的。
- 如果有內存壓力(或「不保持活動」開啓),則只保留2或3個片段;其他碎片被暫停,因此您需要確保
onSaveInstanceState()
已正確實施。當用戶滑回時,碎片將被恢復。但是,恢復片段比創建等效的新活動需要更少的CPU資源。一旦片段被實例化,當用戶從一邊滑到另一邊,CPU使用率將會降低,並且(最重要的)UX將會更平滑由於視圖已經存在並呈現在內存中,因此可以使用。
- 使用父活動作爲通信中心,片段之間的通信相對比較容易。
另一點:ViewPager的用戶界面隱喻與活動堆棧不同。在權衡採取何種方法時,除非實施成本極高,否則您可能應該將UX評估爲實施細節(CPU和內存)。