Activity详解(一)——Activity的生命周期全分析
2016-10-19 18:34
190 查看
Android的生命周期相信大家都很熟悉了,这里记录的是自己在学习开发过程中的一些经验之谈,希望以后自己忘记了能有个笔记翻一下。
(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的生命周期流程图如图所示:
如果用户通过ActivityA打开一个ActivityB,那么是ActivityA先调用完onPause方法之后再调用ActivityB的onResume方法,所以不能在onPause方法中执行耗时很长的操作。
系统配置更改了导致Activity被销毁和重建和由于内存不足更高优先级的应用获得了启动权。
此时,Activity的各个方法调用时序是:
onSaveInstanceState()方法会在onStop方法之前调用,而与onPause方法的顺序没有特定的关系,即既可能在onPause之前调用,也可能在onPause之后调用。
onRestoreInstanceState()方法则会在onStart方法之后调用。
(1) Activity处于前台,即Activity正在和用户交互。
(2) Activity可见但不是处于前台,例如Activity中弹出了一个对话框,此时Activity虽然看得见但是不是处于前台,被切换到了后台。
(3) Activity出于后台并且看不见,例如用户点击home键。
上述优先级情况从高到低,当手机内存不足时,系统就会按照上述优先级从低到高杀死Activity所在的进程。这是Activity的生命周期和第一种情况完全一致,也是调用onSaveInstanceState方法保存状态和调用onRestoreInstanceState方法恢复数据。
configChanges可以指定多个属性,用”|”连接起来即可。下面是一些常见的配置属性及含义。
上面表格的属性虽然多,但是我们常用的也就
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可以指定多个属性,用”|”连接起来即可。下面是一些常见的配置属性及含义。
项目 | 含义 |
---|---|
mcc | SIM卡唯一标识IMSI(国际移动用户识别码)中的国家代码,由三位数字组成,中国为460,。此项标识mcc代码发生了改变 |
mnc | SIM卡唯一标识IMSI(国际移动用户识别码)中的运营商代码,由两位数字组成,中国移动TD系统为00,中国联通为01,中国电信为03,。此项标识mnc发生了改变 |
locale | 设备的本地位置发生了改变,一般指切换了系统语言 |
keyboard | 键盘类型发生了变化,例如用户使用了外接键盘 |
keyboardHidden | 键盘的可访问性发生了改变,比如用户调出了键盘 |
touchscreen | 触摸屏发生了改变,这个不好理解,一般也不用 |
navigation | 系统导航方式发生了改变,这个也不好理解,一般不用 |
screenlayout | 屏幕布局发生了改变,比如用户激活了另一个显示设备 |
fontScale | 用户字体发生了改变,例如切换了字体 |
uiMode | 用户界面模式发生了改变,比如是否开启了夜间模式 |
orientation | 屏幕方向发生了改变,这个是常用的,比如旋转了手机屏幕 |
orientation、keyboardHidden、locale这三个。
相关文章推荐
- 【Android笔记 八】详解android中activity的完整生命周期
- 【Based Android】详解android中activity的完整生命周期
- Android Activity 生命周期详解
- Android Activity生命周期详解
- Android中切换屏幕方向时Activity生命周期函数执行情况分析
- Activity生命周期详解
- Android开发之:Activity生命周期详解
- Activity详解(生命周期、以各种方式启动Activity、状态保存,完全退出等)
- Activity生命周期详解
- activity "生命周期"详解
- android activity详解二:Activity的生命周期
- Android 程式开发:(一)详解Activity —— 1.1生命周期(前言)
- Activity 生命周期详解
- Activity生命周期详解
- 【Android Training - 01】详解Activity生命周期 [ Lesson 2 - 暂停与恢复Activity ]
- Activity详解(生命周期、以各种方式启动Activity、状态保存,完全退出等)
- android activity详解二:Activity的生命周期
- 【Android Training - 01】详解Activity生命周期 [ Lesson 0 - 章节概览 ]
- Activity生命周期详解
- Activity详解(生命周期、以各种方式启动Activity、状态保存,完全退出等)