前言
以前刚学习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