//如果没有设置viewpage的缓存,默认是1 他会缓存左右两侧的fragment 如果切换到第3个页面 那么第1个页面会走onpasuse onstop ondestroyview // 新3页面走setUserVisibleHint oncreateview onstart onresume // 但是不会走deattch和重建不会走attach //缓存中的页面切换过程中不会触发生命周期,只会触发setUserVisibleHint //如果后台切换到前台,只会触发onpause onstop onstart onResume //如果需要后台切换前台也加载数据 就要处理onresume和onpause //如果不需要,直接写在oncreateview
1.众所周知,fragment的生命周期如下:onattch-oncreat-oncreatview-onactivitycreated-onstart-onresume-onpause-onstop-ondestroyview-ondestroy-ondetach.
2.那么问题来了,在切换过程中fragment的生命周期如何。
例子:三个fragment,默认的缓存方式
首先,先进来吧:
09-08 14:51:57.469 23986-23986/com.yosemite.testframeani E/Fragment1: onAttach
09-08 14:51:57.469 23986-23986/com.yosemite.testframeani E/Fragment1: onCreate
09-08 14:51:57.470 23986-23986/com.yosemite.testframeani E/Fragment2: onAttach
09-08 14:51:57.470 23986-23986/com.yosemite.testframeani E/Fragment2: onCreate
09-08 14:51:57.470 23986-23986/com.yosemite.testframeani E/Fragment1: onCreateView
09-08 14:51:57.478 23986-23986/com.yosemite.testframeani E/Fragment1: onActivityCreated
09-08 14:51:57.478 23986-23986/com.yosemite.testframeani E/Fragment1: onStart
09-08 14:51:57.478 23986-23986/com.yosemite.testframeani E/Fragment1: onResume
09-08 14:51:57.480 23986-23986/com.yosemite.testframeani E/Fragment2: onActivityCreated
09-08 14:51:57.480 23986-23986/com.yosemite.testframeani E/Fragment2: onStart
09-08 14:51:57.480 23986-23986/com.yosemite.testframeani E/Fragment2: onResume
可以看到,这是预加载了前两个fragment,第三个没有被加载。
再切换到第二个fragment上看下:
09-08 14:54:16.855 23986-23986/com.yosemite.testframeani E/Fragment3: onAttach
09-08 14:54:16.855 23986-23986/com.yosemite.testframeani E/Fragment3: onCreate
09-08 14:54:16.855 23986-23986/com.yosemite.testframeani E/Fragment3: onCreateView
09-08 14:54:16.859 23986-23986/com.yosemite.testframeani E/Fragment3: onActivityCreated
09-08 14:54:16.860 23986-23986/com.yosemite.testframeani E/Fragment3: onStart
09-08 14:54:16.860 23986-23986/com.yosemite.testframeani E/Fragment3: onResume
可以看到,第三个fragment开始被加载进来了,虽然第三个页面是不可见的。
再切换到第三个页面吧:
09-08 14:55:15.453 23986-23986/com.yosemite.testframeani E/Fragment1: onPause
09-08 14:55:15.453 23986-23986/com.yosemite.testframeani E/Fragment1: onStop
09-08 14:55:15.454 23986-23986/com.yosemite.testframeani E/Fragment1: onDestroyView
可以看到,第一个页面消失了,但是并没有和activity取消关联
那再点击到第二个页面吧:
09-08 14:56:29.046 23986-23986/com.yosemite.testframeani E/Fragment1: onActivityCreated
09-08 14:56:29.046 23986-23986/com.yosemite.testframeani E/Fragment1: onStart
09-08 14:56:29.046 23986-23986/com.yosemite.testframeani E/Fragment1: onResume
可以看到,第一个页面又被展示在前台了。
那就最后再切换到第一个页面吧:
09-08 14:57:52.182 23986-23986/com.yosemite.testframeani E/Fragment3: onPause
09-08 14:57:52.182 23986-23986/com.yosemite.testframeani E/Fragment3: onStop
09-08 14:57:52.182 23986-23986/com.yosemite.testframeani E/Fragment3: onDestroyView
第三个页面被销毁了
结果大概就是,viewpage在滑动中,只会保留,当前显示的fragment左右两侧的两个fragment,其他的全部被ondestroyview了。