共有七个周期函数:onCreate()、onStart()、onResume()、onPause()、onStop()、onRestart()、onDestroy().

七个周期函数解析
- onCreate(): 创建Activity时调用,设置在该方法中,还以Bundle的形式提供对以前存储的任何状态的访问。
- onStart(): Activity变为在屏幕上对用户可见时调用。
- onResume(): Activity开始与用户交互时调用(无论是启动还是重新启动一个活动,该方法总是被调用。
- onPause(): Activity被暂停或收回cpu和其他资源时调用,该方法用户保护活动状态的,也是保护现场。
- onStop(): Activity被停止并转为不可见阶段及后续的生命周期事件时调用。
- onRestart(): Activity被重新启动时调用。该活动仍然在栈中,而不是启动新的Activity。
- onDestroy():当前Activity结束或正在被系统销毁、资源空间等就被回收。
不同场景下Activity生命周期的变化过程
- 启动Activity: onCreate()—>onStart()—>onResume(),Activity进入运行状态。
- Activity退居后台: 当前Activity转到新的Activity界面或按Home键回到主屏: onPause()—>onStop(),进入停滞状态。
- Activity返回前台: onRestart()—>onStart()—>onResume(),再次回到运行状态。
- Activity退居后台,且系统内存不足, 系统会杀死这个后台状态的Activity,若再次回到这个Activity,则会走onCreate()–>onStart()—>onResume()
- 锁定屏与解锁屏幕只会调用onPause(),而不会调用onStop方法,开屏后则调用onResume()
-
退出当前Activity:onPause()->onStop()->onDestory()。
弹出Toast和AlertDialog的时候Activity的生命周期不会有改变
横竖屏切换对Activity生命周期的影响
onSaveInstanceState()和onRestoreInstanceState():
1.不是activity生命周期的方法。
2.不会成对出现。
注意:android2.3和android4.0的生命周期不一样,2.3是先onSaveInstanceState,后onPause,4.0是先onPause,后onSaveInstanceState
- 横竖屏切换与android:configChanges属性有关,android:configChanges="orientation|screenSize|keyboardHidden",在2.3和4.0及以上Activity都不会重新创建。
android:configChanges属性值有:
1)orientation:消除横竖屏的影响
2)keyboardHidden:消除键盘的影响
3)screenSize:消除屏幕大小的影响
4)……- 禁止横竖屏切换:
android:screenOrientation="portrait" 只能竖屏显示android:screenOrientation="landscape"只能横屏显示。
Java代码:
Activity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);以竖屏显示Activity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);以横屏显示- Activity没有重建时,就会调用onConfigurationChanged函数
-
没有设置configChanges属性:
onPause()->
onSaveInstanceState()->
onStop()->
onDestory()->
onCreate()->
onStart()->
onRestoreInstanceState()->
onResume()
Activity生命周期的变化与数据保存和恢复
onSaveInstanceState()特点:
-
并不是永远都会被调用,并不是每次销毁时都会被调用
-
在onStop()方法之前被调用,但不保证会在onPause()方法之前还是之后被调用。
-
以下行为不会被调用:
1)执行finish()方法;
2)主动按Back键。 -
以下行为会被调用:
1)跳转另一个Activity,且没有用finish()函数;
2)长时间在后台也没有显示出来;
3)内存紧张被kill掉;
4)用户直接按home键。
在没有重写onSaveInstanceState()函数时,activity控件的状态(如EditText输入的文字)可能会默认保存,前提条件是UI控件必须赋了id。
总结:
- 持久性的数据:在onPause(),onStop()以及onDestroy()中保存。
- 非持久性的数据:在onSaveInstanceState()保存。
网友评论