一、Activity生命周期变化
贴一张官方的示意图:
activity_lifecycle.png
关于Activity生命周期一般的应用场景,包括以下2种方式。
第一种情况,常规启动、退出Activity,生命周期如下:
启动Activity ->
onCreate ->
onStart ->
onResume ->
onPause ->
onStop->
onDestroy(Activity被销毁)
第二种情况,启动Activity,点击Home键,然后回到Activity
,最后销毁Activity,生命周期如下:
启动Activity ->
onCreate ->
onStart ->
onResume ->
onPause ->
onStop->
onRestart ->
onStart ->
onResume ->
onPause ->
onStop->
onDestroy(Activity被销毁)
我们今天讨论下(Bundle savedInstanceState)与生命周期之间的关系
1、onCreate(Bundle savedInstanceState)
savedInstanceState可能为空
2、onSaveInstanceState(Bundle outState)
onSaveInstanceState,Activity有可能被销毁的时候,我理解的是,当前手机页面被其他activity取代,或者其他app取代,系统会调用这个方法。比如说,点击Home键、电源键,从菜单列表选择其他app;另外,横竖屏切换。
过程为:
onPause->
onSaveInstanceState ->
onStop
⚠️手动调用finish()或者点击手机返回键,不会促发onSaveInstanceState
3、onRestoreInstanState(Bundle savedInstanceState)
有2个Activity:A和B,A Intent to B之后,从B返回A,系统判断A已经被回收,那么必然会启动onRestoreInstanState。
过程:
onCreate ->
onStart ->
onRestoreInstanState ->
onResume
可以看出来,如果有onRestoreInstanState,那么必然有savedInstanceState;如果有savedInstanceState,onRestoreInstanState则不一定存在;
事实上,我的手机使用状态,大多数都只触发savedInstanceState,
那么,如果Activity被系统回收,重新打开,我们可以在onCreate 或者
onRestoreInstanceState,里面获取关键变量的值,它们的区别就是
后者bundle必然不为空,前者可能为空。
二、Fragment生命周期变化
打开一个带有,Fragment的Activity,
过程:
OnAttach ->
OnCreate ->
OnCreateView ->
OnViewCreated ->
OnActivityCreated ->
OnStart ->
OnResume ->
如果隐藏当前Fragment,进入OnHidden
三、Application生命周期变化
下面的日志是,当app切换到后台之后,被系统回收,然后我们再打开app
,整个Application、Activity、Fragment的创建流程
···
2019-03-01 15:02:17.533 : Application// attachBaseContext
2019-03-01 15:02:17.685 : Application// onCreate
2019-03-01 15:02:19.019 : Application// onActivityCreated = A1
2019-03-01 15:02:19.727 : Application// onActivityStarted = A1
2019-03-01 15:02:19.930 : Application// onActivityResumed = A1
2019-03-01 15:02:21.463 : fragment// onAttach
2019-03-01 15:02:21.463 : fragment// onCreate
2019-03-01 15:02:21.567 : fragment// onCreateView
2019-03-01 15:02:21.958 : fragment// onViewCreated
2019-03-01 15:02:21.959 : fragment// onActivityCreated
2019-03-01 15:02:21.959 : fragment// onStart
2019-03-01 15:02:21.970 : fragment// onResume
// 被回收后,重新打开
2019-03-01 15:25:24.046: Application// attachBaseContext
2019-03-01 15:25:24.150: Application// onCreate
2019-03-01 15:25:25.513: Application// onActivityCreated = A1
2019-03-01 15:25:26.209: Application// onActivityStarted = A1
2019-03-01 15:25:26.651: Application// onRestoreInstanceState
2019-03-01 15:25:26.662: Application// onActivityResumed = A1
2019-03-01 15:25:26.671: fragment// onAttach
2019-03-01 15:25:26.671: fragment// onCreate
2019-03-01 15:25:26.850: fragment// onCreateView
2019-03-01 15:25:27.394: fragment// onViewCreated
2019-03-01 15:25:27.395: fragment// onActivityCreated
2019-03-01 15:25:27.395: fragment// onStart
2019-03-01 15:25:27.418: fragment// onResume
···
网友评论