最近一段時間忙于找工作,找到工作之後忙于項目上線,好久沒有寫過部落格,現在感覺終于閑暇了,寫一寫這次項目中需要總結提煉的知識點,給自己留個印象吧,畢竟好記性不如爛筆頭。
首先,寫一寫關于Fragment生命周期的相關。先放上一張老圖!!

Fragment 1 切換到 Fragment 2時生命周期變化
1、通過 add hide show 方式來切換 Fragment
- Fragment1 的生命周期變化為:onCreate()、onCreateView、onStart()、onResume()
回調 onHiddenChanged() 方法
- Fragment2 的生命周期變化為: onCreate()、onCreateView、onStart()、onResume()
- Fragment 2 再次傳回到 Fragment 1:不走任何生命周期方法但是回調 onHiddenChanged()方法
總結:當以這種方式進行 Fragment 1 與 Fragment 2 的切換時,Fragment 隐藏的時候并不走 onDestroyView,所有的顯示也不會走 onCreateView 方法,所有的 view 都會儲存在記憶體
2、使用 replace 的方法進行切換時
- 載入Fragment 1時:
Fragment 1的生命周期:onCreate()、onCreateView()、onStart()、onResume()
- 切換到Fragment2時:
Fragment 1的生命周期:onPause()、onStop()、onDestroyView()、onDestroy()
Fragment 2的生命周期:onCreate()、onCreateV()、onStart()、onResume()
- Fragment 2切換回Fragment 1時:
Fragment2的生命周期:onPause()、onStop()、onDestroyView()、onDestroy()
Fragment 1的生命周期:onCreate()、onCreateV()、onStart()、onResume()
總結:通過 replace 方法進行替換的時,Fragment 都是進行了銷毀,重建的過程,相當于走了一整套的生命周期
3、使用 ViewPager 進行切換時
當使用 ViewPager 與 Fragment 進行切換時,Fragment 會進行預加載操作
所有的 Fragment 都會提前初始--->預加載;
初始化時 Fragment 們的生命周期:
Fragment 1 的生命周期:onCreate()、onCreateView()
Fragment 2 的生命周期:onCreate()、 onCreateView()
Fragment 1 切換到 Fragment 2 的生命周期:
Fragment 1 :不走任何生命周期;
Fragment 2 :走 setUserVisVleHint()方法
切回去也是一樣的
注意: setUserVisVleHint()方法在 Fragment 1 第一次加載的時候不走,隻有在切換的時候 走該方法
/**
*第一個 Fragment 需要處理 setUserVisVleHint()方法,設定為 setUserVisibleHint(true);
*否則會産空指針異常,因為 setUserVisVleHint()方法的優先級高于 onCreate()方法。
*
* @param savedInstanceState
*/
@Override
public void onActivityCreated(Bundle savedInstanceState) {
setUserVisibleHint(true);
super.onActivityCreated(savedInstanceState);
}
主動調用 setUserVisibleHint()方法來控制第一次不會調用setUserVisibleHint方法的問題。
setUserVisibleHint()方法優先onCreateView方法,當onCreateView方法調用後還會再次調用setUserVisibleHint方法。
此時要對是否調用了onCreateView()方法進行标記判斷。
具體加載資料的代碼
/**
* 标志位,标志已經初始化完成
*/
private boolean isPrepared;
@Override
public void onActivityCreated(Bundle savedInstanceState) {
// 配置setUserVisibleHint()方法
setUserVisibleHint(true);
super.onActivityCreated(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = LayoutInflater.from(getActivity()).inflate(R.layout.fragment_a, container, false);
//已經初始化
isPrepared = true;
return view;
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
//可見的并且是初始化之後才加載
if (isPrepared && isVisibleToUser) {
getList();
}
}
Activity 切換到 Fragment 的生命周期變化
Fragment 的生命周期變化為:onStart()、onResume()
從 Fragment 1 進行鎖屏操作
Fragment 的生命周期方法:onPause()、onSaveInstanceState()、onStop()。
從解鎖 到 Fragment 1 的生命周期
onStart()、 onResume()