您的位置:首页 > 其它

Acitivity生命周期分析

2016-04-17 14:41 239 查看
今天周日在家有点无聊,打算复习一下基础知识,于是看了点关于acitivity生命周期的基础知识,打算和大家分享一下。

好了步入正题:

在正常情况下,Activity会经历如下7个生命周期(我数数有没有数错,~~哈哈~~):

1)onCreate:表示Activity正在创建,这是生命周期的第一个方法。一般我们会在这个方法中进行一些初始化的操作,例如setContentView去加载页面,初始化Acitivity的一些所需数据,一般项目中的BaseAcitivity都是在这个生命周期中调用一些抽象方法,将逻辑分离开的。

2)onRestart:表示Acitivity正在重新启动。一般情况下,是当前Acitivity从不可见变为可见状态时调用。例如,你按Home键回到桌面重新再打开这个Activity时,或者从当前Acitivity跳向另一个Acitivity然后回到当前Acitivity时。

3)onStart:表示Activity正在被启动,即将开始,这时Acitivity已经可见了,但是还没有出现在前台,还无法可以和用户交互。这个时候其实我们可以理解为Acitivity意见显示出来了,只是我们还看不到。

4)onResume:表示Activity已经可见了,并且出现在前台开始活动,要注意onStart和onResume都表示Acitivity'已经可见,但是onStart的时候Acitivity还在后台,而onResume的时候Acitivity'已经显示到前台,并且可以和用户进行交互。

5)onPause:表示Acitivity正在停止,正常情况下,会马上调用onStop,如果这个时候快速的回到当前Acitivity,那么onReSume会被调用。当然这中情况比较极端,用户很难重现这一场景。在这个生命周期中,我们可以做一些存储数据,停止动画等工作,但是注意不能太耗时,因为这会影响到新的Activity的显示,onPause必须先执行完,新的Acitivity的onResume才会执行。(这句话很重要,记住)

6)onStop:表示Acitivity即将停止活动,这时候我们可以做一些稍微重量级的回收工作,同样不能太耗时。

7)onDestory:表示Acitivity即将被销毁,这是Acitivity生命周期中的最后一个回调,在这里,我们可以做一些回收工作和释放一些资源。

具体过程如下图:



下面我们根据具体情况分析一下这个流程:

1.针对某一个特定的一个Acitivity,第一次启动时,回调如下:onCreate->onStart->onResume

2.打开新的Activity和或者切换到桌面的时候,回调如下:onPause->onStop。这里有种特殊情况,如果新的Acitivity采用 了透明主题,那么当前Acitivity不会回调onStop

3.当用户再次回到原Activity时,回调如下:onRestart->onStart->onResume.

4.当用户按back键回退时,回调如下:onPause->onStop-onDestory.

5.当Activity被系统回收后再次打开,生命周期回调过程和过程1是一样的。

这样我们先做一个小结:从整个生命周期来看,onCreate和onDestory是配对的,分别标志着Acitivity的创建和销毁,并且只可能有一次调用。从Acitivity是否可见来说,onStart和onStop是配对的,随着用户的操作或者设备屏幕的点亮和熄灭,这两个方法是可能被调用多次的。从Activity是否在前台来说,onResume和onPause是配对的,同样,随着用户的操作或者设备屏幕的点亮和熄灭,这两个方法是可能被调用多次的。

在这里提出一个问题:假设当前Acitivity为A,用户打开一个新的Acitivity B,那么这时候生命周期的回调过程是什么呢。

答案是 A的onPause->B的onCreate->B的onStart->B的onResume->A的onStop

为什么会这样呢,我们来简单分析一下,当A跳向B时,它首先会退出前台,所以它会先回调A的onPause,这个我们都可以理解,但是为什么没有马上回调A的onStop呢,我们可以从是否可见去理解,当我们去启动一个新的Acitivity时候,肯定是新的Acitivity全部显示出来,上一个Activity才会完全处于不可见状态,这样分析一下,是不是就理解了上面的回调过程,对2中不回调onStop也明白了呢。

上面的分析都是建立在正常的情况下,大家有没有想过在一些异常情况下,生命周期又是怎样的呢。

首先我们来了解一下什么是所谓的异常情况(可不包括你程序出了Bug 崩溃了(●'◡'●)):

情况1:资源相关的系统配置发生改变导致Acitivity被杀死并重新创建(例如横竖屏切换)

情况2:资源内存不足导致优先级的Acitivity被杀死

这时候生命周期如下图:



通过这个图是不是对在异常状况下,保存页面状态又有了新思路呢,好了今天就分析这么多了~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: