代码继续接上文《Android碎片学习(二)——动态添加、返回栈、通信》
先回顾一下活动的生命周期:《安卓开发——活动的生命周期》,活动有四种状态:暂停态,运行态,停止态,销毁态。同样在碎片中,也是这四种状态
一、状态和回调
四状态
- 运行态:碎片可见,所关联的活动处于运行态
- 暂停态:所关联的活动处于暂停态
- 停止态:所关联的活动处于停止态,或通过
replace()
和remove()
等方法移除掉碎片。总之,碎片此时完全不可见,有可能被系统回收 - 销毁态:所关联的活动处于销毁态,或通过
replace()
和remove()
等方法移除掉碎片。总之,碎片此时完全不可见,已经被系统回收
五回调
onAttach()
:当碎片和活动建立关联时调用
onCreateView()
:为碎片加载布局时调用
onActivityCreated()
:碎片与相关联的活动已经创建完毕时调用
onDestroyView()
:当与碎片关联的视图被移除时调用
onDetach()
:碎片与活动解除关联时调用
一张图
二、体验生命周期
修改RightFragment.java
public class RightFragment extends Fragment {
private static final String TAG = "RightFragment";
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "onCreate: 活动第一次被创建");
}
@Override
public void onAttach(@NonNull Context context) {
super.onAttach(context);
Log.d(TAG, "onAttach: 与活动建立关联");
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy: 活动被销毁");
}
@Override
public void onDestroyView() {
super.onDestroyView();
Log.d(TAG, "onDestroyView: 碎片的布局被销毁");
}
@Override
public void onDetach() {
super.onDetach();
Log.d(TAG, "onDetach: 碎片和活动已解除关联");
}
@Override
public void onStop() {
super.onStop();
Log.d(TAG, "onStop: 活动完全不可见");
}
@Override
public void onPause() {
super.onPause();
Log.d(TAG, "onPause: 另一个活动准备调用");
}
@Override
public void onResume() {
super.onResume();
Log.d(TAG, "onResume: 活动就绪,准备交互!");
}
@Override
public void onStart() {
super.onStart();
Log.d(TAG, "onStart: 活动由不可见变为可见");
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Log.d(TAG, "onActivityCreated: 活动创建完毕");
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
Log.d(TAG, "onCreateView: 碎片加载布局");
return inflater.inflate(R.layout.right_fragment, container, false);
}
}
启动应用:
1、右碎片显示
onAttach
: 与活动建立关联
onCreate
: 活动第一次被创建
onCreateView
: 碎片加载布局
onActivityCreated
: 活动创建完毕
onStart
: 活动由不可见变为可见
onResume
: 活动就绪,准备交互!
点击按钮:
2、右碎片被替换
onPause
: 另一个活动准备调用
onStop
: 活动完全不可见
onDestroyView
: 碎片的布局被销毁
按下BACK:
3、右碎片回归
onCreateView
: 碎片加载布局
onActivityCreated
: 活动创建完毕
onStart
: 活动由不可见变为可见
onResume
: 活动就绪,准备交互
继续BACK:
4、右碎片销毁
onPause
: 另一个活动准备调用
onStop
: 活动完全不可见
onDestroyView
: 碎片的布局被销毁
onDestroy
: 活动被销毁
onDetach
: 碎片和活动已解除关联
5、另一种碎片
如果没有transaction.addToBackStack(null);
,那么在点击按钮时就会发生右布局的销毁。
三、个人总结生命周期
仔细一思索,之前的推断是错的,请将上文所有的活动
替换为碎片
。正确的生命周期的理解是经过以下流程:
- 创建到显示:等布局加载完才是创建完毕
onAttach
: 碎片与活动建立关联onCreate
: 碎片第一次被创建onCreateView
: 碎片加载布局onActivityCreated
: 碎片创建完毕onStart
: 碎片由不可见变为可见onResume
: 碎片就绪,准备交互
- 被替换:等碎片不可见后才去销毁布局
onPause
: 该碎片准备回收onStop
: 碎片完全不可见onDestroyView
: 碎片的布局被销毁
- 回归显示:免去了第一步的建立关联和
onCreate
过程,直接创建布局onCreateView
: 碎片加载布局onActivityCreated
: 碎片创建完毕onStart
: 碎片由不可见变为可见onResume
: 碎片就绪,准备交互
- 销毁:
onPause
: 该碎片准备回收onStop
: 碎片完全不可见onDestroyView
: 碎片的布局被销毁onDestroy
: 碎片被销毁onDetach
: 碎片和活动已解除关联