viewpage中对于fragment的生命周期

//如果没有设置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了。
 

 


 


 

 

 

 

 

你可能感兴趣的:(Android)