碎片的生命周期
碎片的运行状态分为4个状态
- 运行状态:当碎片处于可见状态,并且与之相关的活动也处于运行状态时,碎片也处于运行状态。
- 暂停状态:当一个活动进入暂停状态(由于另一个并未占满整个屏幕的活动被加到栈顶)的时候,与它相关联的可见碎片就会进入到暂停状态。
- 停止状态:当一个活动处于停止状态,那么与之相关联的碎片也会处于停止状态,或者通过FragmentManager的remove(),replace() 方法将碎片从活动中移除,如果在事务提交之前调用FragmentManager.addBackToStack()方法,当前的碎片会进入停止状态。总的来说进入停止状态的碎片是完全不可见的,会随时被系统回收。
- 销毁状态:碎片总是依附于活动而存在的,如果活动处于销毁状态,那么与之相关的碎片也会处于销毁状态, 或者通过FragmentManager的remove(),replace()方法将碎片从活动中移除,并且在事务提交之前并没有调用addBackToStack()方法的话,该碎片也会进入销毁状态。
与Activity类似,Fragment类也提供了一些回调方法,贯穿了碎片的整个生命周期,fragment类几乎包含了活动的所有方法,同时也附加了一写方法:
- onAttach(): 当碎片与活动建立关联的时候调用。
- onCreateView(): 为碎片创建视图(加载布局)调用。
- onActivityCreated(): 确保与碎片相关联的活动一定已经创建完成后调用。
- onDestoryView(): 当与碎皮相关联的视图被销毁时调用。
- OnDetach(): 当碎片与活动取消关联时调用。
示例图:
可以利用上一篇《Fragment的案例解析》的碎片类改动后,运行观察碎片类的生命周期。改动后的类如下所示:
public class RightFragment extends Fragment {
public static final String TAG="RightFragment";
@Override
public void onAttach(Context context) {
super.onAttach(context);
Log.d(TAG, "onAttach: ");
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "onCreate: ");
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view= inflater.inflate(R.layout.right_fragment, container, false);
Log.d(TAG, "onCreateView: ");
return view;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Log.d(TAG, "onActivityCreated: ");
}
@Override
public void onStart() {
super.onStart();
Log.d(TAG, "onStart: ");
}
@Override
public void onResume() {
super.onResume();
Log.d(TAG, "onResume: ");
}
@Override
public void onPause() {
super.onPause();
Log.d(TAG, "onPause: ");
}
@Override
public void onStop() {
super.onStop();
Log.d(TAG, "onStop: ");
}
@Override
public void onDestroyView() {
super.onDestroyView();
Log.d(TAG, "onDestroyView: ");
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy: ");
}
@Override
public void onDetach() {
super.onDetach();
Log.d(TAG, "onDetach: ");
}
}