Activity生命周期超详细总结

前言

以前刚学习Activity的时候觉得只要知道流程就可以了,反正流程不就是什么onCreate到onDestroy的么,但是学习一定要知其然还要知其所以然,流程和生命周期并不是一个概念的(所以说对学习要有高度的态度,太随意会吃亏),最近做完一个App,需要很熟悉场景的切换以及对数据的处理,十分考验对生命周期的熟悉度,以下是我总结学习的经验,欢迎小伙伴们学习借鉴,如有不对的地方也请望指出来~~

执行流程分析

一.onCreate(Bundle savedInstanceState)

创建Window相关数据,当前不可见并处于后台

场景:1.Activity创建。2.Activivty因内存不够而销毁然后重新进来。

建议操作:大部分初始化工作,设置布局以及初始化控件信息等。

参数:savedInstanceState,因内存不足/手机旋转而关闭Activity时可以把数据保存在这里

#onContentChanged()#主生命周期

场景:在Activity调用setContentView()或addContentView()方法的回调

建议操作:findViewById()

#onRestart()#非主生命周期

从Activity或者桌面切换回来

#onPostCreate()#主生命周期

执行完onCreate会调用,很少用到

二.onStart()

已创建Window相关数据,当前可见,但处于后台

场景:1.Activity正常生命周期。2.Activity切换回来。3.按Home键再切换回。4.Activivty因内存不够而销毁然后重新进来。

建议操作:数据初始化和动画的初始化

#onRestoreInstanceState(Bundle savedInstanceState)#非主生命周期

当Activity被销毁后出发,用于恢复用户数据,需要和onSaveInstanceState配合使用

场景:1.Activity被杀死再回来。2.改变屏幕方向。

三.onResume()

处于前台,用户已经看见但不能交互,也无法获取控件实际宽高等数据

场景:1.Activity正常生命周期。2.Activity切换回来。3.按Home键再切换回来。4.Activivty因内存不够而销毁然后重新进来

建议操作:开启动画,打开独有设备(比如摄像头)

#onPostResume()#主生命周期

执行完onResume()会调用,很少用到

四.onWindowFocusChanged(boolean isFocus)

表示用户已经看见Activity并且获取到了焦点,也可以交互,可以获取控件的实际宽高

场景:1.对话框(键盘,popwindow,dialog)弹出和消失。2.Activity跳转与返回(执行2次)3.按Home键切换

建议操作:对获取失去焦点特别针对/要求的操作(比如设置对话框的实际宽高并显示)

五.onPause()

表示这个Activity将会被停止一段时间并且使用者很可能会再次回到你的Activity来。但是这也很可能表示着用户正在离开你的app。

场景:1.窗口半透明或者被半遮盖。2.跳转到另一个Activity。3.按Home键去桌面

建议操作:结束占用CPU的动画或其他运行任务,释放系统资源

#onSaveInstanceState(Bundle savedInstanceState)#主生命周期

Activity 容易被销毁的时候调用, 注意是容易被销毁, 也可能没有销毁就调用了

场景:1.按下home键。2.锁屏。3.跳转到其他Activity。4.横竖屏切换

建议操作:保存你想保存的数据

注意:finish()不会执行此方法,必须要Android销毁才会执行

六.onStop()

表示这个Activity已经完全的被遮盖或用户看不见,在此前必会调用onPause()

场景:1.跳转到另一个Activity。2.按home去桌面

建议操作:保存一些持久化数据

七.onDestroy()

表示这个Activity已经被销毁了

常见场景

1.跳转到另一个Activity再回来

A->B:onWindowFocusChanged()->onPause()->onSaveInstanceState()->onStop()

B:onCreate()->onStart()->onResume()->onWindowFocusChanged()

B->A:onRestart()->onStart()->onResume()->onWindowFocusChanged()

2.Activity后台被杀死再回来

A:onCreate()->onStart()->onRestoreInstanceState()->onResume()->onWindowFocusChanged()

3.对话框弹出与消失

A:onWindowFocusChanged()

4.锁屏/按Home键去桌面

A:onPause()->onSaveInstanceState()->onStop()->onWindowFocusChanged()

5.解锁/从桌面回来

A:onRestart()->onStart()->onResume()->onWindowFocusChanged()

区别

1.onCreate()和onStart()的区别?
onCreate()只执行一次,并且不可见,onStart()会执行多次(上面提到的场景),并且可见(并不是能看见),最后是两者做的事情也不一样。

2.onResume()onWindowFocusChanged()的区别?
前者主要附着于Activity的生命周期,并且不能获取控件数据并设置(比如对话框的宽度是屏幕的4/5),后者主要针对当前视窗的焦点状态,并且可以获取到所有控件的完整数据并设置

3.onPause()和onResume()的关系
前者是用户暂时离开,在这里可以做一些数据的保存,后者是用户切换回来,这里可以做一些数据的恢复,当然这两种操作有相关的方法实现,重要的是明白它的意思就行。

4.与生命周期密切相关的onSaveInstanceState方法和onRestoreInstanceState方法在什么时候执行?
当targetSdkVersion小于3时onSaveInstanceState是在onPause方法中调用的,而大于3时是在onStop方法中调用的。
而onRestoreInstanceState是在onStart之后、onResume之前调用的。

参考资料

  • 深入理解Activity的生命周期
  • Activity生命周期中三个不常用的方法:onContentChanged,onPostCreate,onPostResume

你可能感兴趣的:(Activity生命周期超详细总结)