使用ViewPager控制片段生命周期

时间:2014-11-13 05:37:10

标签: android memory android-fragments android-viewpager

我正在使用带有片段的ViewPager(我有4个片段),我需要确保一个特定的片段始终保存在内存中。这是因为我有一个向它发送消息的服务。

因为ViewPager会因为内存消耗而破坏片段,所以我不能保证这个片段会在内存中。

所以,我使用viewPager.setOffscreenPageLimit(3)来确保我的所有片段都在内存中。即使这不是保证工作(我认为),因为ViewPager可以做出行政决定并随意销毁我的一些碎片。

所以,我的问题是,我可以控制哪些片段始终保存在内存中并且永远不会被破坏,或者我应该缓存消息并在特定片段的onCreateView上读取它们吗?

2 个答案:

答案 0 :(得分:0)

你绝对应该使用后一种方法:在某处保存你的消息,然后让Fragment获取数据。试图控制Android UI对象的生命周期是一场失败的战斗。

一种可能的方法是在构造片段时使用Fragments.setArguments,因为Android会在片段被销毁然后重新创建时维护参数。不确定这是否适用于ViewPager,但它是一个很好的旋转解决方案。

答案 1 :(得分:0)

我会为您的活动提出另一种设计方案。

你可以创建一个无头背景片段(一个没有UI从null返回onCreateView()的片段)并将其设为retained。这将确保片段始终保持活动状态,即使设备已旋转且活动重新创建也是如此。此片段必须从您的服务接收消息,并在活动的所有组件中“重新分发”它们。这可以是一些通过standard interface based approach(这是无效的),或者您可以使用像TinyBusEventBus这样的事件总线,最终将会减少更少的代码。

ViewPager中的片段将订阅感兴趣的事件,由ViewPager创建。因此,您不需要始终创建任何UI片段,而只需保留一个背景片段。