这里说的应用的生命周期不是说一个应用从研发到上线的产品层面的生命周期,而是应用自身运行的生命周期。虽然这两个生命周期的概念是不一样的,但是在生命的层面上都有从产生到消亡的过程,二者在这点上是一致的。 应用的生命周期是应用在宿主的环境中从创建,运行,到消亡的一种过程描述,对用户来说一个直观的感受是一个应用启动了,应用退出了,应用后台了。实际上,一个应用在实际运行的过程中会有很多生命周期的状态描述,以一个Android的应用为例: 这个图中的Activity我们可以简单的理解为呈现给用户的应用界面,可以看到这里有八种状态在按照一定的顺序进行切换,上半部分属于创建,下半部分属于消亡,但是整个过程并不是完全不可走回头路的,消亡路径上生命周期也可以跳转到对应的创建路径上的生命周期。应用的生命周期不是由应用开发者控制的,开发者只可以发出一些指令给宿主系统,比如启动一个Activity,退出一个Activity,宿主系统就开始操控Activity或创建或销毁,并把整个过程中的关键节点通知给应用开发者。 这里的每个节点都有自己的意义: onCreate表示应用开始创建了,但这个时候应用的界面并没有展现个用户,开发者可以在这里创建需要展现的数据,以及构建一些视图,其实系统处理应用绘制还是比较快的,但是我们经常发现有些应用从桌面点击启动半天没反应,过了好一会才弹出界面,问题就出在这里,很多应用在开发时将大量耗时操作写在了这个生命周期中,卡住了后续界面绘制的相关操作。 例如一个软件中有大量的数据存在数据库,开发者希望应用一启动就能将数据以列表的形式展现给用户,因此在onCreate中读取了大量的数据,并构建了一个很长的列表,那么在这一切准备好之前,用户看到的就是点了半天没动静,体验自然不好,但是数据和视图没有准备好就将界面展示给用户,用户不就看到空白的界面了吗?是的,但是很多时候程序设计时采用了一些规避的办法,在卡顿和空白页之间寻找一个平衡点,例如只读取少量的数据,构建少量的视图,尽快将界面展现个用户后,再去加载更多的数据和视图,还有一种简单粗暴的办法就是闪屏,onCreate这个生命周期就贴张图,尽快让程序进入绘制流程,等用户看到闪屏了,再去慢慢加载数据视图,这样至少不会等的无聊和莫名其妙。当然很多用户不喜欢闪屏,感觉上还是慢的带盐人,所以还有种做法就是退出时将应用截图保存,启动时用之前的截图做闪屏,这样应用的启动至少看起来要快一些。 onStart,onResume依次在onCreate之后被调用,但是应用还未进入running,为什么还要拆出这细分的中间状态呢,这个就需要结合onPause,onStop一起说明了。从生命周期的图中我们可以看到,onCreate是不可重入(一个完整的生命周期中反复调用)的,而onStart,onResume,onPause,onStop是可以重入的。当界面已经呈现给用户,但是这个时候有个弹框挡住了部分应用的界面,但是应用界面还是可见,这时应用进入了onPause状态,当弹窗消失后,应用进入了onResume状态,但是如果不是弹窗,而是其它应用启动完全挡住了当前的应用界面,那么当前应用就进入了onStop状态,当遮挡的应用消失后,被遮挡的应用则又会回到onStart状态(中间还有一个onRestart状态,和onStart状态的区别在于它不会在这个生命周期开始的过程中被调用),当然不仅是被其它应用遮住,用户主动后台这种导致应用不可见的情况也会触发到onStop,在很多优化中,当应用不可见时,开发者会主动释放应用的部分资源,减少系统消耗,让出更多的资源给其它应用。 而onDestroy则是onCreate的对立面,一旦应用到了onDestroy的阶段,就没法像onPause,onStop一样走回头路了。通常这个生命周期都是应用开发者向系统发出了退出应用的指令后,系统在销毁Activity的时候回调的。而退出应用也很容易出现像onCreate一样的问题,例如我们经常看到有些应用点了退出后会卡一下,然后消失,看了之前onCreate的分析,这里的原因也很容易分析了,即用户点击了退出按钮后,应用开发者向系统发出了关闭Activity的指令,同时开发者做了许多销毁资源的耗时操作,而这个时候应用界面仍然是可见的,这些操作卡住了后续的界面销毁流程,所以给用户的感受就是点了退出之后顿住了一会。解决办法也很简单,在程序退出流程中界面不可见后的生命周期中去做耗时操作,这样界面没有挡住用户做其它的事情,用户就感觉不到了。 如果上面的不太好理解,我们可以这样去看这些生命周期,onCreate(人出生),onStart(人醒来),onResume(人睁开眼),onPause(人闭上眼),onStop(人睡着),onDestroy(人死亡)。出生和死亡不可逆,而醒睡,睁闭眼则在人的一身中不断反复,先要闭眼然后睡着,醒了之后会睁开眼睛开始活动。出生后会经历醒来,睁眼,拜了个拜前也会经历闭眼,沉睡,应了小沈阳那句:眼睛一闭一睁,一天过去了,一闭不睁,一辈子就过去了(我们不考虑睁眼睡的特异人士,和死不瞑目的特殊情况)。 了解这些生命周期后,再去把玩自己的或是别人的应用,就可以感受到程序设计优劣了,偶尔还能提点建设性的意见了。