Activity的生命周期

Author Avatar
罗炜光 7月 09, 2016
  • 在其它设备中阅读本文章

正常的Activity生命周期

  1. 启动 onCreate -> onStart -> onResume
  2. 当跳转到另一个Activity时,当前Activity先onPause,跳转的Activity执行onCreate -> onStart -> onResume 后,当前的Activity执行onStop
  3. 当用户返回原Activity时,当前Activity先onPause,原Activity执行onRestart -> onStart -> onResume 后,当前的Activity执行onStop -> onDestyoy

跳转的Activity为透明主题

  1. 当跳转到透明主题Activity时,当前Activity先onPause,跳转的透明主题Activity执行onCreate -> onStart -> onResume 后,当前的Activity 不会执行 onStop
  2. 当透明主题跳转的不透明主题时,透明主题Activity执行onPause后,最初Activity会执行onStop(因为不可见了),跳转的不透明主题Activity执行onCreate -> onStart -> onResume 后,透明主题Activity 会执行 onStop
  3. 当从不透明主题返回透明主题时,当前的Activity执行onPause后,最初的Activity执行onRestart -> onStart , 而后才会到透明主题Activity的创建onCreate -> onStart -> onResume,不透明主题执行onStop -> onDestyoy
  4. 当透明主题Activity返回到最初Activity时,透明主题Activity执行onPause,最初的Activity执行onResume(不执行onRestart -> onStart,因为最初Activiyu是可见的,没有执行到onStop),透明主题Activity执行onStop -> onDestyoy

屏幕切换时Activity的生命周期

屏幕切换是会先销毁当前Activiy并重建此Activity,具体流程为onPause -> onSaveInstanceState -> onStop -> onDestroy -> onCreate -> onStart -> onRestoreInstanceState -> onResume

其中onSaveInstanceState用于保存信息,而onRestoreInstanceState用于还原信息,view中也有onSaveInstanceState与onRestoreInstanceState方法,比如EditView,但EditText需要设置id才有效

在Activity中onSaveInstanceState与onRestoreInstanceState都有两种不同参数的方法,一种是(Bundle outState),另一种是(Bundle outState, PersistableBundle outPersistentState),第二种是API21新增的,使Activity拥有持久化能力

要使用第二种方法要在配置文件中为我们的Activity设置一个属性:android:persistableMode=”persistAcrossReboots”

会在下述情形中被调用:

  1. 点击home键回到主页或长按后选择运行其他程序
  2. 按下电源键关闭屏幕
  3. 启动新的Activity
  4. 横竖屏切换时,肯定会执行,因为横竖屏切换的时候会先销毁Act,然后再重新创建 重要原则:当系统”未经你许可”时销毁了你的activity,则onSaveInstanceState会被系统调用,这是系统的责任,因为它必须要提供一个机会让你保存你的数据(你可以保存也可以不保存)。

Activity的其他方法

  • onWindowFocusChanged 在Activity窗口获得或失去焦点时被调用

获取焦点时调用

失去焦点时调用

  • onApplyThemeResource 设置主题时调用,第一次调用在onCreate()前,使用setTheme()方法也会调用
  • onConfigurationChanged 在AndroidManifest.xml给Activity配置了相应的configChanges属性,这个时候Activity就不会摧毁后重新创建Activity,而只会回调此方法

参考资料

Android开发艺术探索
bug修复-android中的onCreate两个参数的方法是什么鬼?