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的onAttachonCreateonCreateViewonViewCreated是在Activity的setContentView中执行的。

想一下就知道,Activity的setContentView的目的是从xml中加载View,而我把fragment写在了xml里面。

这里有个小插曲,事实证明,Activity的super.onCreate可以写在setContentView之后,但是xml中存在fragment时就会报错。

fragment的onActivityCreatedonStart是在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的onDestroyViewonDestroyonDetach在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: 后