Android-Activity的生命周期全面分析

Activity的生命周期分为两部分:1,典型情况下的生命周期,指在用户参与的情况下Activity所经过的生命周期的改变;2,异常情况下的生命周期,指Activity被系统回收或者当前设备的Configuration发横改变从而导致Activity被销毁重建。

典型情况下的生命周期

在正常情况下,生命周期如下:

onCreate

表示Activity正在被创建,这是生命周期的第一个方法。在这个方法里可以做一些初始化工作,比如调用setContentView去加载界面布局,初始化Activity所需的数据等。

onRestart

表示Activity正在重新启动。一般情况下,当当前Activity从不可见到重新变为可见状态时,onRestart方法会被调用。这种情况一般是用户导致的,比如用户按Home键切换到桌面或用户打开一个新的Activity,当前的Activity就会暂停,也就是onPause和onStop被执行了,接着用户又回到了这个Activity,就会出现这种情况了。

onStart

表示Activity正在被启动,即将开始,这时Activity已经可见了,但是还没有出现在前台,还无法和用户交互。也就是Activity已经出现了,但我们还不能看到。

onResume

表示Activity已经可见了,并且出现在前台开始活动了。

onPause

表示Activity正在停止,正常情况下,接着onStop就会被调用。此时可以执行一些存储数据,停止动画的操作,但是注意不能太耗时,因为这个方法结束,下一个Activity的onResume才能执行,如果时间太长会造成Activity切换卡顿。

onStop

表示Activity即将停止,可以做一些重量级的回收,但最好也不要太耗时。

onDestroy

表示Activity即将被销毁,这是最后一个回调,做所有资源的释放和回收。

经典图片:

Android-Activity的生命周期全面分析_第1张图片

具体解释

1,针对一个特定的Activity,第一次启动,回调是onCreate->onStart->onResume。
2,当用户打开新的Activity或者切换到桌面时,回调是onPause->onStop。这里有一个特殊情况,如果新的Activity采用透明主题,那么当前Activity不会回调onStop。
3,当用户再次回到Activity时,回掉是onRestart->onStart->onResume。
4,当用户按Back键时,回调是onPause->onStop->onDestroy。
5,当Activity被系统回收后再次打开,生命周期回调过程和(1)一样。是生命周期方法一样,不代表过程一样。

异常情况下的生命周期

我们应该能够猜到,Activity除了被用户杀死外还有可能被系统杀死。情况如下:

情况1:资源相关的配置发生改变导致Activity被杀死并重新创建

拿最简单的图片资源来说吧,手机横屏和竖屏时加载的图片可能不是一个资源,那么此时就会导致系统配置发生改变,在默认情况下,Activity会被销毁并且重新创建,当然我们可以组织系统重新创建我们的Activity。
Activity出现意外情况->onSaveInstanceState然后又两种情况
    ->onDestroy
    ->onCreate->onRestoreInstanceState

当前Android已经做了一定程度的数据恢复了。当然也可以重写onSaveInstanceState和onRestoreInstanceState方法来实现自定义的数据的恢复。

情况2:资源内存不足导致优先级低的Activity被回收

这种情况不容易模拟,但是很容易能够想到。
1,前台Activity——正在和用户交互,优先级最高。
2,可见但非前台Activity——比如弹出了一个对话框,导致Activity无法和用户直接交互。
3,后台Activity——已经被暂停的Activity,优先级最低。
这些也会回调onSaveInstanceState和onRestoreInstanceState来存储和恢复数据。一些工作不适合放在后台Activity中执行,最好是放进Service中执行。

阻止因系统配置发生改变而重新创建Activity

在mainfest中配置:

android:configChanges="orientation"

如果想指定多个值,用“|”来连接。
比如

android:configChanges="orientation|keyboardHidden"

这个配置项是非常多的,下面详细介绍:

项目 含义
mcc SIM卡唯一标识IMSI(国际移动用户识别码)中的国家代码,由三位数组成,中国是460。此项标识mcc发生改变
mnc SIM卡唯一标识IMSI(国际移动用户识别码)中的运营商代码,由两位数组成,中国移动TD是00,中国联通是01,中国电信是03。此项标识mnc发生改变
locale 设备的本地位置发生了改变,一般是指切换了系统语言
touchscreen 无视它
keyboard 键盘类型发生了改变,比如用了外插键盘
keyboardHidden 键盘的可访问性发生了改变,如果拔掉了外插键盘
navigation 无视它
screenLayout 屏幕布局发生改变,比如激活了另一个屏幕
fontScale 系统字体发生改变
uiMode 用户界面发生了改变,比如开启了夜间模式(API8添加)
orientation 屏幕方向发生改变
screenSize 旋转也会导致这个改变
smallestScreenSize 无视他
layoutDirection 无视他

你可能感兴趣的:(android)