viewPager下的fragment生命周期变化

微信的四个页面使用viewPager + Fragment实现。那么我们滑动的时候fragment的生命周期是如何变化的呢?

创建四个fragment。activity布局中使用viewPager,然后在activity代码中添加fragment。

布局和微信一样:

我们启动应用的时候,生命周期辩护如下:

activity: onCreate
activity: onStart
activity: onResume
fragmentChat: onAttach
fragmentChat: onCreate
fragmentAddress: onAttach
fragmentAddress: onCreate
fragmentChat: onCreateView
fragmentChat: onActivityCreated
fragmentChat: onStart
fragmentChat: onResume
fragmentAddress: onCreateView
fragmentAddress: onActivityCreated
fragmentAddress: onStart
fragmentAddress: onResume

activity启动完成后并显示界面,接着fragment再执行各个生命周期。那么这里为什么会执行第二个fragment的生命周期?
我们再向左滑动。

08-06 04:06:38.725 2336-2336/wechat.lu.wechat D/fragment: fragmentFind: onAttach
fragmentFind: onCreate
08-06 04:06:38.727 2336-2336/wechat.lu.wechat D/fragment: fragmentFind: onCreateView
fragmentFind: onActivityCreated
fragmentFind: onStart

这时候在第二个fragment,但是又初始化了第三个fragment。再向左滑动

08-06 04:10:07.060 2336-2336/wechat.lu.wechat D/fragment: fragmentMe: onAttach
08-06 04:10:07.061 2336-2336/wechat.lu.wechat D/fragment: fragmentMe: onCreate
fragmentChat: onPause
fragmentChat: onStop
08-06 04:10:07.062 2336-2336/wechat.lu.wechat D/fragment: fragmentChat: onDestroy
08-06 04:10:07.064 2336-2336/wechat.lu.wechat D/fragment: fragmentMe: onCreateView
08-06 04:10:07.065 2336-2336/wechat.lu.wechat D/fragment: fragmentMe: onActivityCreated
fragmentMe: onStart
fragmentMe: onResume

发现第一个fragment执行了ondestroy。到这里应该清楚了fragment和viewpager的变化。每次进行滑动的时候,viewPager都会预先加载当前fragment相邻的两个fragment,而不相邻的fragment就会被相应的执行onpause,onstop,onDestroy。

fragmentMe: onCreateView
fragmentMe: onActivityCreated
fragmentMe: onStart
fragmentMe: onResume

这四个生命周期回调函数,并没有执行onAttach和onCreate,所以fragment被恢复,而不是重新创建。因为我使用的适配器是fragmentPagerAdapter,这个适配器适用于fragment较少的情况下,并且该适配器只是把fragment与当前视图分离,不进行删除,所以这就是没有执行以上两个生命周期函数的原因。

fragment较多的情况下,官方建议使用FragmentStatePagerAdapte。

官方的fragment生命周期:

z切换到后台之后圣经周期变化:

08-06 04:17:13.234 2336-2336/wechat.lu.wechat D/fragment: fragmentFind: onPause
fragmentMe: onPause
activity: onPause
08-06 04:17:14.326 2336-2336/wechat.lu.wechat D/fragment: fragmentFind: onStop
fragmentMe: onStop
activity: onStop

因为我滑到了第四个fragment,所以第二个fragment被destroy了,因此这里只有两个fragment。

接着恢复后台:

08-06 04:19:35.548 2336-2336/wechat.lu.wechat D/fragment: fragmentFind: onStart
fragmentMe: onStart
activity: onStart
activity: onResume
08-06 04:19:35.549 2336-2336/wechat.lu.wechat D/fragment: fragmentFind: onResume
fragmentMe: onResume

从后台恢复的生命周期执行和activity一致,都是onstart——>onResume。

接下来使用横竖屏切换模仿activity被kill之后重建的情况:

和重新启动一样,activity和fragment的生命周期都会跑一遍。不详细解释。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章