典型情况下的生命周期
在正常情况下,Activity会经历如下生命周期。如图
activity_lifecycle.png
-
onCreate():表示
Activity
正在被创建,这是声明周期的第一个方法。在这个方法中可做一些初始化工作。 -
onRestart():表示
Activity
重新启动。一般情况下,当当前Activity从不可见重新变为可见状态时,onRestart()
就会被调用,这种情况是用户行为所导致的,比如用户按Home
键切换到桌面或者打开一个新的Activity,这是当前Activity
就会暂停,也就是onPause
和onStop
会执行,接着用户又回到了这个Activity
,onRestart()
就会执行。 -
onStart():表示
Activity
在启动,这是Activity
已经可见了,但是还没有出现在前台,还无法和用户交互。 -
onResume():表示
Activity
已经可见,并出现在前台可以进行交互,onRestart
和onResume
都表示可见,但onStart
时Activity
还在后台,onResume
时Activity
在前台,可以交互。 -
onPause():表示
Activity
处于暂停状态,不能和用户交互,当系统即将开始继续另一个 Activity 时调用。 此方法通常用于确认对持久性数据的未保存更改、停止动画以及其他可能消耗 CPU 的内容。 -
onStop():表示
Activity
处于停止状态,已经不可见,如果 Activity即将被销毁,或另一个 Activity(一个现有 Activity 或新 Activity)继续执行并将其覆盖,就可能发生这种情况。 -
onDetory():表示
Activity
即将被销毁,可以做一些回收工作和资源的释放。
注意:如果系统在紧急情况下必须回收内存,则可能不会调用onStop()
和onDestroy()
,因此,应该在onPause()
向存储设备写入至关重要的持久性数据(例如用户编辑)。但是不能太耗时,因为该方法中的任何阻止过程都会妨碍向下一个 Activity 的转变并拖慢用户体验。
特定情况下Activity生命周期
-
情况一:创建一个Activity,重写生命周期的各个方法,观察各个方法的执行顺序。(先启动一个界面,然后,按返回键)
onCreate
-->onStar
-->onResume
-->onPause
-->onStop
-->onDestroy
-
情况二:启动一个界面,按home键,然后,重新启动该界面,再按返回键。
①启动一个界面,按home
键onCreate
-->onStart
-->onResume
-->onPause
-->onStop
②重新启动该界面,onRestart
-->onStart
-->onResume
③按返回键,onPause
-->onStop
-->onDestroy
-
情况三:启动一个界面,在该界面上点击按钮,启动下一个界面,然后,按返回键,再按返回键。
①启动一个界面,在该界面上点击按钮,启动下一个界面
main onCreate
-->main onStart
-->main onResume
-->main onPause
-->Second onCreate
-->Second onStart
-->Second onResume
-->main onStop
②按返回键
Second onPause
-->main onRestart
-->main onStart
-->main onResume
-->Second onStop
-->Second onDestroy
③再按返回键
main onPause
-->main onStop
-->main onDestroy
-
情况四:启动一个界面,在该界面上点击按钮,启动下一个界面(没有完全覆盖第一个界面),然后,按返回键,再按返回键。
①启动一个界面,在该界面上点击按钮,启动下一个界面(没有完全覆盖第一个界面)
main onCreate
-->main onStart
-->main onResume
-->main onPause
-->Second onCreate
-->Second onStart
-->Second onResume
②按返回键
Second onPause
-->main onResume
-->Second onStop
-->Second onDestroy
③再按返回键
main onPause
-->main onStop
-->main onDestroy
保存 Activity 状态
当系统配置发生改变或优先级高的应用需要内存时,Activity有可能会被销毁,其中onPause
、onStop
、onDestory
会被调用,或异常情况下系统会先调用 onSaveInstanceState()
,然后再使 Activity销毁。系统会向该方法传递一个Bundle
,可以在其中使用putString()
和putInt()
等方法以名称-值对形式保存有关 Activity 状态的信息。然后,如果系统终止应用进程,并且用户返回Activity,则系统会重建该 Activity,并将Bundle
同时传递给onCreate()
和onRestoreInstanceState()
。可以使用上述任一方法从Bundle
提取保存的状态并恢复该 Activity 状态。如果没有状态信息需要恢复,则Bundle
是空值(如果是首次创建该 Activity,就会出现这种情况)。
注意:无法保证系统会在销毁Activity 前调用onSaveInstanceState()
,因为存在不需要保存状态的情况(例如用户使用“返回”按钮离开Activity 时,因为用户的行为是在显式关闭 Activity)。如果系统调用 onSaveInstanceState()
,它会在调用onStop()
之前,并且可能会在调用onPause()
之前进行调用,(顺序不一定)
不过,我们也要知道不过,即使什么都不做,也不实现 onSaveInstanceState()
,Activity
的 onSaveInstanceState()
默认实现也会恢复部分 Activity 状态。具体地讲,默认实现会为布局中的每个View
调用相应的 onSaveInstanceState()
方法,让每个视图都能提供有关自身的应保存信息。Android 框架中几乎每个小部件都会根据需要实现此方法,以便在重建 Activity 时自动保存和恢复对 UI 所做的任何可见更改。例如,EditText
控件保存用户输入的任何文本,CheckBox
控件保存复选框的选中或未选中状态。只需为想要保存其状态的每个控件提供一个唯一的 ID(通过android:id
属性)。如果控件没有 ID,则系统无法保存其状态。
系统配置发生改变后的生命周期
当系统配置发生改变后,Activity实例可以重新创建,也可以不重新创建,如果不想重新创建,可以在清单文件<activity>
标签下设置android:configChanges
属性,比如不想屏幕方向改变后重新创建,那么就设置android:configChanges="orientation"
,该属性声明配置将阻止 Activity 重新启动。 Activity 反而会保持运行状态,并且系统会调用其onConfigurationChanged()
方法。其中常用的属性有
-
orientation
屏幕方向发生了变化 — 用户旋转了设备。 -
screenSize
当前可用屏幕尺寸发生了变化。它表示当前可用尺寸相对于当前纵横比的变化,因此会在用户在横向与纵向之间切换时发生变化。 不过,如果您的应用面向 API 级别 12 或更低级别,则 Activity 始终会自行处理此配置变更(即便是在 Android 3.2 或更高版本的设备上运行,此配置变更也不会重新启动 Activity)。 -
keyboardHidden
键盘无障碍功能发生了变化 — 例如,用户显示了硬件键盘。
网友评论