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的生命週期都會跑一遍。不詳細解釋。

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