一、相信各位Android开发的同胞,提起Activity的生命周期,大家再熟悉不过了,而且也是每次面试被频繁问及的知识点。虽然比较简单,但是在这里,我还是要帮大家回忆一下,以免觉得简单,等被问及的时候,忘记了,就懵逼了!!
废话不多说,上图:
大家看到,这幅图,应该会比较熟悉,因为这张图太经典了。
二、下面我就接着,给大家加深一下记忆,也是自己再面试中,实际被问到过的:
就是如果有两个Activity,FirstActivity和SecondActivity。这时,如果从打开FirstActivity开始,然后从FirstActivity跳转到SecondActivity,再把SecondActivity关闭,到FirstActivity。这其中经历的生命周期?
我们在这里,把这个操作分为两步:
第一步,从打开FirstActivity,到跳转到SecondActivity。
第二步,关闭SecondActivity,回到FirstActivity。
(1)首先,从打开FirstActivity到跳转到SecondActivity,所经历的生命周期(【】中为哪个Activity的生命周期函数):
onCreate【FirstActivity】——>onStart【FirstActivity】——>onResume【FirstActivity】——>onPause【FirstActivity】——>onCreate【SecondActivity】——>onStart【FirstActivity】——>onResume【FirstActivity】——>onStop【FirstActivity】。
好了到这里,已经跳转到SecondActivity,在这里,我自己也实际写代码,确认了一下:
得到的结果是:
(2)第二步,从SecondActivity回到FirstActivity:
onPause【SecondActivity】——>onRestart【FirstActivity】——>onStart【FirstActivity】——>onResume【FirstActivity】——>onStop【SecondActivity】——>onDestory【SecondActivity】。
好了,到这里,第二步的生命周期也回调完毕。
小结
综上所述,整个过程所经历过的生命周期函数顺序依次是:
onCreate【FirstActivity】——>onStart【FirstActivity】——>onResume【FirstActivity】——>onPause【FirstActivity】——>onCreate【SecondActivity】——>onStart【SecondActivity】——>onResume【SecondActivity】——>onPause【SecondActivity】——>onRestart【FirstActivity】——>onStart【FirstActivity】——>onResume【FirstActivity】——>onStop【SecondActivity】——>onDestory【SecondActivity】。
三、将手机屏幕切换成横屏时当前Activity所执行的生命周期
(1)当AndroidManifest里面未设置android:configChanges时
由竖屏切换为横屏:
onPause->onStop->onSaveInstanceState->onDestory->onCreate->onStart->onRestoreInstanceState->onResume
其中onSaveInstanceState和onRestoreInstanceState是两个重要的回调函数。当Activity异常退出时,系统调用onSaveInstanceState()来保存Activity的当前状态。同样的,当该Activity重新创建时,会调用onRestoreInstanceState()来恢复之前的状态。
由横屏切换成竖屏:onPause->onStop->onSaveInstanceState->onDestory->onCreate->onStart->onRestoreInstanceState->onResume
(2)如果配置了android:configChanges="orientation",同上
(3)如果配置了android:configChanges="orientation| screenSize"
通过在AndroidManifest里面配置android:configChanges,来避免横竖屏时Activity重走生命周期。
此时横屏切换为竖屏 以及 竖屏切换为横屏时,都只会执行一次onConfigurationChanged方法。
四、关于onSaveInstanceState(Bundle outState)与onRestoreInstanceState
1、onSaveInstanceState的调用时机
- 当用户按下HOME键
- 从最近应用中选择运行其他的程序时
- 按下电源键(关闭屏幕显示)时
- 从当前activity启动一个新的Activity时
- 屏幕方向切换时(无论竖屏切横屏还是横屏切竖屏都会调用)
Activity的onSaveInstanceState回调时机,取决于app的targetSdkVersion:
targetSdkVersion低于11的app,onSaveInstanceState方法会在Activity.onPause之前回调;
targetSdkVersion低于28的app,则会在onStop之前回调。
targetSdkVersion大于28,onSaveInstanceState在onStop回调之后才回调。
2、onRestoreInstanceState什么时机调用
onRestoreInstanceState(Bundle savedInstanceState)只有在activity确实是被系统回收,重新创建Activity的情况下才会被调用。
- 屏幕方向切换时(无论竖屏切横屏还是横屏切竖屏都会调用)
- 由于内存紧张导致后台运行的程序被kill掉时
好了,到这里就结束了。菜鸟一个,有不足或者错误的地方,希望大家能评论留言帮我指正。