正常情况下,除了Window,Dialog和Toast,我们能见到的界面只有Activity。
典型情况下的生命周期:
(1) onCreate:表示Activity 正在被创建。此方法中我们可以做初始化工作,调用setContentView加载页面布局资源,初始化Activity所需数据。
(2)onRestart ,Activity重新启动,从后台恢复过来。onPause和onStop执行过了。
(3)onStart:Activity正在被启动,已经可见但没有在前台,无法与用户交互。
(4)onResume:Activity已经可见,出现在前台。
(5)onPause:Activity停止运行,紧接着onStop会被调用。此时可以做一些存储数据,停止动画的工作。但不能太耗时间,新的Acitivity在前一个Activity 的onPause执行完之后,执行onResume
(6)onStop:Activity即将停止,可以做一些稍微重量级的回收工作。
(7)onDestroy:表示Activity即将销毁。做资源回收工作和最后的资源释放。
1. 针对一个特定的Activity,第一次启动,回调:onCreat->onStart->onResume.
2. 用户打开新的Activity,或者切换会桌面时,回调:onPause->onStop.
注意:如果新的Activity 采取了透明主题,则当前的Activity不会回调onStop
3. 当用户再次回到Activity时,回调:onRestart->onStart->onResume.
4. 当用户按back键回退是,回调:onPause->onStop->onDestroy
5.当Activity被系统回收重新打开步骤和1一样
6.onCreate <->onDestroy
onStart<->onStop
onResume<->onPause
异常情况下的生命周期
1. 资源的相关配置发生改变导致的Activity被杀死并重新创建
onSaveInstanceState()和onRestoreInstanceState(),系统自动为我们做了恢复工作。
旋转屏幕也算异常终止Activity
系统只在Activity异常终止的时候才会调用onSaveInstanceState 和onRestroeInstanceState来存储和恢复数据,替他情况下不会出发这个过程。
2. 资源内存不足导致低优先级的Activity被杀死
Activity的优先级:见https://www.jianshu.com/p/f880733d07d5
当系统的配置发生改变后,Activity会被重新创建,如果不像系统重新创建Activity,可以给Activity指定configChanges属性。不像让Activity在屏幕旋转,或者键盘消失的时候重建,
eg:android:configChanges="orientation|keyBoardHidden"
列出 Activity 将自行处理的配置更改。在运行时发生配置更改时,默认情况下会关闭 Activity 然后将其重新启动,但使用该属性声明配置将阻止 Activity 重新启动。 Activity 反而会保持运行状态,并且系统会调用其 onConfigurationChanged() 方法。
注:应避免使用该属性,并且只应在万不得已的情况下使用。 如需了解有关如何正确处理配置更改所致重新启动的详细信息,请阅读处理运行时变更。
任何或所有下列字符串均是该属性的有效值。多个值使用“|”分隔 — 例如,“locale|navigation|orientation”。
所有这些配置变更都可能影响应用看到的资源值。 因此,调用 onConfigurationChanged() 时,通常有必要再次获取所有资源(包括视图布局、可绘制对象等),以正确处理变化。
但是,自从Android 3.2(API 13),在设置Activity的android:configChanges="orientation|keyboardHidden"后,还是一样会重新调用各个生命周期的。因为screen size也开始跟着设备的横竖切换而改变。所以,在AndroidManifest.xml里设置的MiniSdkVersion和 TargetSdkVersion属性大于等于13的情况下,如果你想阻止程序在运行时重新加载Activity,除了设置"orientation",你还必须设置"ScreenSize"。
解决方法:
AndroidManifest.xml中设置android:configChanges="orientation|screenSize“