Activity的生命周期详解

1.Activity生命周期的全面分析

本文将Activity的生命周期分为两部分内容。一部分是正常情况下的生命周期,另一部分是异常情况下的生命周期。正常情况下的生命周期指的是Activity在用户的参与中所经历的的生命周期;而异常情况下的生命周期指的是Activity被系统回收,或者当前设备的Configurarion发生变化从而导致了Activity的销毁和重建带来的Activity生命周期的变化。正常情况下与异常情况下Activity的生命周期关注点稍有不同,下面将分别从这两种情况进行介绍:

1.1正常情况下Activity的生命周期

正常情况下Activity会经历如下声明周期

(1)onCreate

表示Activity正在被创建,这是Activity生命周期中的第一个方法,在这个方法中我们可以去进行一些初始化的工作,比如加载布局setContentView,初始化一些数据initData(),即 一个新的Activity被创建的时候,会执行该方法,并且在生命周期中,该方法只会被执行一次。

(2)onRestart

表示Activity正在重新启动,可以理解为一个Activity由不可见状态重新变为可见状态,一般这种情况下由用户操作导致。比如:当用户在当前的Activity按了Home键,或者打开了一个新的Activity这个时候当前Activity调用了onPasue和onStop方法,变为了不可见的状态。当用户从桌面打开应用重新回到该Activity或者在新的Activiity按了返回键回到了该Activity,这个时候该Activity调用了onRestart和onResume方法,调用onRestart使得Activity重新变为可见的状态,但是还未显示在前台,还不能和用户进行交互。调用onResume方法后使得Activity显示到前台,这个时候Activity可以和用户进行交互。

(3)onStart

表示Activity正在被启动,该方法执行在onCreate方法之后,从语义上和onRestart对比可以得知,一个是正在被启动,一个是重新被启动,启动后,Activity都是可见的状态,但是还未显示到前台,不能和用户进行交互。

(4)onResume

表示Activity已经可见了,并且显示在前台开始活动,在这里要注意的一点就是和onStart,onRestart的对比,onResume表示Activtity可见,并且显示到了前台可以和用户进行交互,而onStart与onRestart虽然可见,但是还未展示到前台,还不能和用户进行交互。

(5)onPause

表示Activity正在被停止,正常情况下紧接着会执行onStop方法,Activity由可见状态变为不可见状态,比如:用户在当前的Activity启动一个新的Activity或者按Home键回到桌面,该Activity的onPause方法会执行,此时可以做一些数据存储,停止动画的工作,但是注意不能太耗时,因为会影响到新的Activity的显示,onPause必须执行完,新的Activity的onResume才会被执行。可以理解为必须使得当前Activity展示到后台,才能让新的Activity展示到前台。

(6)onStop

表示Activity即将停止,此时Activity还存在,但是不可见了

(7)onDestroy

表示Acitvity即将被销毁,该方法是Activity生命周期中的最后第一个方法,这个时候可以做一些回收和最终资源的释放工作。

正常情况下,Activity会经历以上7个生命周期。下面用一张图来描述Activtiy的切换过程


Activity的生命周期详解_第1张图片

对于上图的描述,下面将提一些需要注意的地方:

(1)Activity A第一次启动,调用onCreate、onStart、onResume

(2)Activity A 启动Activity B的时候,A会调用onPause 然后B调用onCreate、onStart、onResume 最后A调用onStop。在这里需要注意的是,如果A是透明的主题,A最后不用调用onStop

(3)再次回到Activity A  A 会调用onRestart、onStart、onResume

(4)用户按下返回键 onPause、onStop、onDestroy

1.2异常情况下Activity的生命周期

在上面我们介绍了用户在正常情况下操作Activity的生命周期。接着我们就来介绍一下异常情况下Activity的生命周期的变化。我们知道当资源相关的系统配置发生变化,或者内存不足会导致Activity被杀死,下面我们就来介绍下面这两种情况:

1.2.1资源相关的系统配置发生变化导致Activity被杀死和重建

举个简单的例子,就用图片来说,我们为了兼容不同的设备,会在不同的drawable目录存放图片,这个时候我们进行切换横竖屏,就会导致系统配置发送了变化,从而导致了Activity被销毁和重建的过程。由于Activity被销毁,onPause、onStop、onDestroy均被调用。但是由于Activity是在异常情况下被杀死的,所以系统会调用onSaveInstanceState来保存当前Activity的状态。onSaveInstanceState必须执行在onStop方法之前。当Activity被重新创建的时候,系统会调用onRestoreInstanceState方法,并且把销毁的时候onSaveInstanceState保存的Bundle对象传递到onRestoreInstanceState和onCreate方法中,我们可以根据onRestoreInstanceState和onCreate中传递的Bundle参数来判断Activity是否是重建的,如果是,则取出数据进行恢复。需要注意的是,onRestoreInstanceState执行在onStart之后。

在这我们可能比较疑问,系统保存和恢复的是那些数据?当Activity需要重建的时候,系统会自动为我们保存Activity的View的结构,并且在重新创建的时候自动恢复这些数据,比如用户输入的数据,ListView滑动位置,View的选中状态等等。

关于保存和恢复View的层次结构,系统的工作流程是这样的:首先Activity被意外终止的时候,Activity会调用onSaveInstanceState进行保存数据,然后Activity委托window去保存数据,接着window委托顶层容器保存数据,顶层容器是一个viewGroup,一般很可能是DecorView。最后顶层容器在一一的通知它的子元素来保存数据,这样整个数据保存过程就完成了。

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

Activity按照优先级别高到低排序,一般情况下会分为如下三种:

(1)正在和用户交互的Activity

(2)可见但是不能交互的Activity比如对话框之后的Activity

(3)后台Activity,已经被停止了的Activity,执行了onStop之后的Activity

当系统内存不足的时候,就会杀死优先级低的Activity所在进程,然后调用onSaveInstanceState和onSaveInstanceState进行数据的存储恢复操作。同时我们也知道,当进程中没有运行有四大组件,该进程很容易被杀死,因此后台工作进程为了不容易被杀死,比较好的方法就是将该工作运行在Service中,保证了进程有一定的优先级,从而不容易被杀死。

你可能感兴趣的:(Activity的生命周期详解)