您的位置:首页 > 移动开发 > Android开发

Activity详解(一)——Activity的生命周期全分析

2016-10-19 18:34 190 查看
Android的生命周期相信大家都很熟悉了,这里记录的是自己在学习开发过程中的一些经验之谈,希望以后自己忘记了能有个笔记翻一下。

1.Activity正常的生命周期

     我们平常所说的生命周期就是正常的生命周期,也是Activity典型的生命周期,从Activity创建到结束会调用如下方法:

     (1)onCreate:在Activity创建的时候调用。我们新建一个Activity的时候就会看到这个方法,通常在里面初始化资源。

     (2)onStart:onCreate方法调用完成之后就会调用onStart方法。此时Activity已经属于可见状态,只不过我们还看不到,因为此时Activity还处于后台。要看到Activity得等onResume方法执行完毕。

     (3)onResume:该方法表示Activity已经被调到前台来了,不仅属于可见状态,我们肉眼还可以看到。要注意该方法和onStart方法的对比,onStart方法虽然也表示Activity处于可见状态,当时此时Activity还看不到,而onResume方法调用之后,Activity才算真正的可见。

     (4)onPause:在用户点击返回键或者后台键时,Activity会调用该方法,表示Activity被挂起了,看不到了。

     (5)onStop:在onPause方法执行完之后就会紧接着执行该方法,理论上是有可能在执行完onPause方法之后回到Activity而不执行onStop方法,不过这要求用户拥有极快的手速,所以一般不考虑这种情况,即调用完onPause之后马上调用onStop方法,而不考虑着两个方法之间还会有什么逻辑。onStop距离Activity真正被销毁只有一步之遥了,所以可以在这个方法里面做一些轻量级资源的回收保存的操作,但不能太耗时。

     (6)onDestroy:调用完该方法之后Activity算是真正地被销毁了,所以需要在这个方法里面做一些资源释放操作,例如释放数据库连接等。

     (7)onRestart:该方法是在调用onStop方法时,如果用户返回Activity,那么就会回调该方法,然后调用onStart,进入Activity的生命周期,而不会调用onCreate。

Activity的生命周期流程图如图所示:



注意事项:

当用户打开新的Activity或者按home键切换到桌面的时候,调用的方法是onPause->onStop,但是如果新打开的Activity是透明的,即可以看到原来的Activity时,只会调用onPause而不调用onStop。

如果用户通过ActivityA打开一个ActivityB,那么是ActivityA先调用完onPause方法之后再调用ActivityB的onResume方法,所以不能在onPause方法中执行耗时很长的操作。

2.异常情况下Activity的生命周期

对于正常情况下Activity的生命周期,相信大家都很熟悉,下面记录的是异常情况下Activity的生命周期。Activity在异常情况下的生命周期分两种:

系统配置更改了导致Activity被销毁和重建和由于内存不足更高优先级的应用获得了启动权。

2.1 资源相关的系统配置发生改变导致Activity被杀死并重建

资源相关的系统配置发生改变最常见的是手机横竖屏切换。当系统配置发生改变后,Activity就会被销毁,调用onPause、onStop、onDestroy等方法。同时由于Activity是在异常情况下被销毁的,所以会调用onSaveInstanceState()方法来保存当前Activity的状态,然后再次创建该Activity的时候就会回调onRestoreInstanceState()方法,通过Bundle对象来恢复Activity的一些状态。

此时,Activity的各个方法调用时序是:

onSaveInstanceState()方法会在onStop方法之前调用,而与onPause方法的顺序没有特定的关系,即既可能在onPause之前调用,也可能在onPause之后调用。

onRestoreInstanceState()方法则会在onStart方法之后调用。

2.2 资源内存不足导致优先级低的Activity被杀死

首先我们学习一下Activity的优先级情况,如下:

(1) Activity处于前台,即Activity正在和用户交互。

(2) Activity可见但不是处于前台,例如Activity中弹出了一个对话框,此时Activity虽然看得见但是不是处于前台,被切换到了后台。

(3) Activity出于后台并且看不见,例如用户点击home键。

上述优先级情况从高到低,当手机内存不足时,系统就会按照上述优先级从低到高杀死Activity所在的进程。这是Activity的生命周期和第一种情况完全一致,也是调用onSaveInstanceState方法保存状态和调用onRestoreInstanceState方法恢复数据。

3.针对2.1系统配置更改时Activity被销毁的解决方法

系统配置更改时会销毁Activity并重新创建Activity,当不想系统销毁重建Activity时可通过给Activity指定configChanges属性。系统配置有很多内容,如果当某项内容发生改变后,我们不想Activity重建可以给Activity指定具体某项配置,如屏幕旋转时可以指定orientation这个属性,这样就会告诉系统,当屏幕旋转时不销毁重建Activity。

configChanges可以指定多个属性,用”|”连接起来即可。下面是一些常见的配置属性及含义。

项目含义
mccSIM卡唯一标识IMSI(国际移动用户识别码)中的国家代码,由三位数字组成,中国为460,。此项标识mcc代码发生了改变
mncSIM卡唯一标识IMSI(国际移动用户识别码)中的运营商代码,由两位数字组成,中国移动TD系统为00,中国联通为01,中国电信为03,。此项标识mnc发生了改变
locale设备的本地位置发生了改变,一般指切换了系统语言
keyboard键盘类型发生了变化,例如用户使用了外接键盘
keyboardHidden键盘的可访问性发生了改变,比如用户调出了键盘
touchscreen触摸屏发生了改变,这个不好理解,一般也不用
navigation系统导航方式发生了改变,这个也不好理解,一般不用
screenlayout屏幕布局发生了改变,比如用户激活了另一个显示设备
fontScale用户字体发生了改变,例如切换了字体
uiMode用户界面模式发生了改变,比如是否开启了夜间模式
orientation屏幕方向发生了改变,这个是常用的,比如旋转了手机屏幕
上面表格的属性虽然多,但是我们常用的也就
orientation、keyboardHidden、locale
这三个。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 经验