1、重温基础
1)activity 生命周期
activity 启动: onCreat() –> onStart() –> onResume()
activity 关闭: onpause() –> onStop() –> onDestroy();
2)Fragment 生命周期
Fragment创建: onAttach() –>onCreatView() –>onViewCreated() –>onActivityCreated() –>onStart() –>onResume();
Fragment销毁: onPause() –>onStop() –>onDestroyView() –>onDestroy()–>onDetach()
2、Activity和Fragment 的生命周期回调顺序:
问题:
在activity中创建一个fragment ,其生命周期如何调用的呢?
话不多说直接上图
当点击home键时有如何进行呢?
注意:activity 和fragment生命周期的先后顺序。
但是在网上很多人给出的生命周期顺序是这样的:
细心地同学发现了,activity 和fragment生命周期的顺序刚好相反。很奇怪 我很快发现问题原因:
//我写的
@Override
protected void onPause() {
Log.d("activity", "---->onPause");
super.onPause();
}
//对方写的
@Override
protected void onPause() {
super.onPause();
Log.d("activity", "---->onPause");
}
刚好顺序调用反了!那怎么知道 是先走activity 的onPause()方法 还是 先走fragment 的onPause()方法呢? 问题一度尴尬!(其实我已经知道结果了…嘿嘿)
//之后就出现了 以下的代码!
@Override
protected void onPause() {
Log.d("activity", "---->onPause 之前");
super.onPause();
Log.d("activity", "---->onPause 之后");
}
果然发现:先走avtivity的onPause()方法,之后通过调用才调用 fragment的onPause().
3、问题挖掘
通过log日志猜测:Fragment的onPause方法是通过 super.onPause()调用的。
查看源码
//FragmentActivity
/**
* Dispatch onPause() to fragments.
*/
@Override
protected void onPause() {
super.onPause();
mResumed = false;
if (mHandler.hasMessages(MSG_RESUME_PENDING)) {
mHandler.removeMessages(MSG_RESUME_PENDING);
onResumeFragments();
}
//果然 是通过 FragmentController 分发Pause()改变fragment的状态的
mFragments.dispatchPause();
}
...
//FragmentController
/**
* Moves all Fragments managed by the controller's FragmentManager
* into the pause state.
* <p>Call when Fragments should be paused.
*
* @see Fragment#onPause()
*/
public void dispatchPause() {
mHost.mFragmentManager.dispatchPause();
}
4、结论
在activity 中创建的fragment 其生命周期是:先调用activity对应的生命周期,之后由activity的父类FragmentActivity通过FragmentController 更改Fragment对应的生命周期的。
有问题欢迎指正!