Fragment在Activity中的生命周期
记忆方式
Fragment的onAttach,onCreate,onCreateView,onViewCreated在附加到Activity时执行,如setContentView或者add,replace时。
Fragment的onResume是在Activity的onResume执行完之后才会执行,而其他生命周期都在Activity的super.onXXX内执行。
跳转时,前一个页面的生命周期走到onPause时暂停,等待后一个页面的生命周期走到onResume之后,再继续执行onStop;同理,返回时后一个页面走到onPause时暂停,前一个页面onRestart,onStart,onResume之后,再继续执行剩下的onStop,onDestory。
懒加载
Fragment的懒加载主要是用于ViewPager中,ViewPager会在加载fragment之前调用其setUserVisibleHint()方法。所以setUserVisibleHint()是在onActtch()方法之前调用。
流程图

启动
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| D: FirstActivity's super.onCreate: 前
D: FirstActivity's super.onCreate: 后
D: FirstActivity's setContentView: 前
D: FirstFragment's onAttach:
D: FirstFragment's onCreate:
D: FirstFragment's onCreateView:
D: FirstFragment's onViewCreated:
D: FirstActivity's setContentView: 后
D: FirstActivity's super.onStart: 前
D: FirstFragment's onActivityCreated:
D: FirstFragment's onStart:
D: FirstActivity's super.onStart: 后
D: FirstActivity's super.onResume: 前
D: FirstActivity's super.onResume: 后
D: FirstFragment's onResume:
|
fragment的onAttach,onCreate,onCreateView,onViewCreated是在Activity的setContentView中执行的。
想一下就知道,Activity的setContentView的目的是从xml中加载View,而我把fragment写在了xml里面。
这里有个小插曲,事实证明,Activity的super.onCreate可以写在setContentView之后,但是xml中存在fragment时就会报错。
fragment的onActivityCreated、onStart是在Activity的super.onStart方法中执行。
fragment的onResume是在activity的super.onResume之后执行。
跳转
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| D: FirstActivity's super.onPause: 前
D: FirstFragment's onPause:
D: FirstActivity's super.onPause: 后
D: SecondActivity's super.onCreate: 前
D: SecondActivity's super.onCreate: 后
D: SecondActivity's setContentView: 前
D: SecondFragment's onAttach:
D: SecondFragment's onCreate:
D: SecondFragment's onCreateView:
D: SecondFragment's onViewCreated:
D: SecondActivity's setContentView: 后
D: SecondActivity's super.onStart: 前
D: SecondFragment's onActivityCreated:
D: SecondFragment's onStart:
D: SecondActivity's super.onStart: 后
D: SecondActivity's super.onResume: 前
D: SecondActivity's super.onResume: 后
D: SecondFragment's onResume:
D: FirstActivity's super.onStop: 前
D: FirstFragment's onStop:
D: FirstActivity's super.onStop: 后
|
fragment的onPause是在Activity的super.onPause中执行。
当第二个含有fragment的Activity可见后,上一个Activity的生命周期才会继续。
然后上一个fragment的onStop在Activity的onStop中执行。
注意,前一个Activity执行到onPause,然后第二个Activity生命周期完成后,前一个Activity才会执行onStop。
返回
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| D: SecondActivity's super.onPause: 前
D: SecondFragment's onPause:
D: SecondActivity's super.onPause: 后
D: FirstActivity's super.onRestart: 前
D: FirstActivity's super.onRestart: 后
D: FirstActivity's super.onStart: 前
D: FirstFragment's onStart:
D: FirstActivity's super.onStart: 后
D: FirstActivity's super.onResume: 前
D: FirstActivity's super.onResume: 后
D: FirstFragment's onResume:
D: SecondActivity's super.onStop: 前
D: SecondFragment's onStop:
D: SecondActivity's super.onStop: 后
D: SecondActivity's super.onDestroy: 前
D: SecondFragment's onDestroyView:
D: SecondFragment's onDestroy:
D: SecondFragment's onDetach:
D: SecondActivity's super.onDestroy: 后
|
先执行第二个Activity的onPause。
再回调前一个Activity的onRestart。
fragment的onStart在Activity的super.onStart中执行。
fragment的onResume在Activity的super.onResume中执行。
fragment的onStop在Activity的super.onStop中执行。
fragment的onDestroyView、onDestroy、onDetach在Activity的super.onDestroy中执行。
注意fragment的onResume是在Activity的onResume之后执行的!!!
退入后台
1
2
3
4
5
6
| D: FirstActivity's super.onPause: 前
D: FirstFragment's onPause:
D: FirstActivity's super.onPause: 后
D: FirstActivity's super.onStop: 前
D: FirstFragment's onStop:
D: FirstActivity's super.onStop: 后
|
回到前台
1
2
3
4
5
6
7
8
| D: FirstActivity's super.onRestart: 前
D: FirstActivity's super.onRestart: 后
D: FirstActivity's super.onStart: 前
D: FirstFragment's onStart:
D: FirstActivity's super.onStart: 后
D: FirstActivity's super.onResume: 前
D: FirstActivity's super.onResume: 后
D: FirstFragment's onResume:
|
退出
1
2
3
4
5
6
7
8
9
10
11
12
13
| D: FirstActivity's super.onPause: 前
D: FirstFragment's onPause:
D: FirstActivity's super.onPause: 后
D: FirstActivity's super.onStop: 前
D: FirstFragment's onStop:
D: FirstActivity's super.onStop: 后
D: FirstActivity's super.onDestroy: 前
D: FirstFragment's onDestroyView:
D: FirstFragment's onDestroy:
D: FirstFragment's onDetach:
D: FirstActivity's super.onDestroy: 后
|