今天写一下使用最频繁的一个组件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开发艺术探索这本书