Activity生命周期详解

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

Activity生命周期详解_第1张图片
Activity生命周期.jpg

七个周期函数解析

  • 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()保存。

你可能感兴趣的:(Activity生命周期详解)