Activity的生命周期全面分析

来源:互联网 发布:淘宝卖家改价 编辑:程序博客网 时间:2024/05/29 10:26

今天写一下使用最频繁的一个组件Activity,在使用的过程中一定要知道的一些概念,主要包括生命周期和启动模式以及IntentFilter的匹配规则。

Activity的生命周期

Activity的生命周期分成两部分的内容,一部分就是典型情况下的生命周期,就是用户参与下的情况,Activity的生命周期变化。一部分就是异常情况下的生命周期,就是系统被回收或者当前设备Configuration发生变化导致的activity被销毁重组。

一 、Activity典型下的生命周期

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

     (1)onCreate:在Activity创建的时候调用。我们新建一个Activity的时候就会看到这个方法,  通常在里面初始化资源,比如setContentView 去加载界面布局资源,初始化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.1 情况1 :资源相关的系统配置发生改变导致Activity被杀死并重新创建

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

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

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

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

首先我们学习一下Activity的优先级情况,如下:
(1) Activity处于前台,即Activity正在和用户交互。
(2) Activity可见但不是处于前台,例如Activity中弹出了一个对话框,此时Activity虽然看得见但是不是处于前台,被切换到了后台。
(3) Activity出于后台并且看不见,例如用户点击home键。

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

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

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

android:configChanges="orientation"

大致的Activity的生命周期就是这样,希望对大家有所帮助,其实如果清晰Activity的生命周期的变化,在项目中可以使用生命周期来存储一些数据和改变界面的数据,特别方便。下一章详细介绍一下Activity的启动模式~

参考Android开发艺术探索这本书

原创粉丝点击