美文网首页安卓面试
Activity异常情况下的生命周期

Activity异常情况下的生命周期

作者: 乌托邦式的爱情 | 来源:发表于2021-06-14 10:58 被阅读0次

    既然是探究Activity异常情况下的生命周期,首先就得搞明白Activity在哪些情况下会出现异常情况。在实际的开发过程中,我们经常会碰到的异常情况大概有以下两种。

    情况一:资源相关的系统配置发生改变导致Activity被杀死并重新创建。

    这种情况产生的可能性会很多,最常见的就是旋转屏幕,当然还有就是系统提供的模式切换等等。当然,针对异常情况,系统本身提供了方法供我们处理后续事件。最重要的两个方法就是onSaveInstanceState和onRestoreInstanceState,其中onSaveInstanceState用于在异常情况下Activity被销毁时保存我们想要保存的数据,onRestoreInstanceState用于异常情况下的Activity被销毁重建后获取保存的数据。下面我们以旋转屏幕来举例。

    首先我们来看一下异常情况下Activity的生命周期执行情况:

    2.png

    注意看,当我们旋转手机屏幕的时候,首先执行了onPause方法,紧接着执行onSaveInstanceState方法,在这里我们可以对我们需要保存的数据进行处理了,最后执行onStop->onDestroy,到这里意味着MainActivity被销毁了。但是紧接着你会发现MainActivity会被重新创建,它会执行onCreate->onStart->onRestoreInstanceState->onResume方法,我们可以很清楚的看到,创建MainActivity所执行的方法里面比正常情况下的生命周期多了一个

    onRestoreInstanceState方法,那么现在我们来试一试如果在onSaveInstanceState保存数据,在onRestoreInstanceState方法里面是否能够拿到我们保存的数据,对MainActivity做稍微修改,如下:


    3.png

    这个代码很简单,就是在onSaveInstanceState里面存一个key为name,值为stevens的数据,

    然后在onRestoreInstanceState里面拿出这个数据,注意需要进行非空判断,现在运行程序看看打印的结果。

    4.png

    发现没有,发现没有,我们真的在onRestoreInstanceState方法里面拿到了我们之前存储的数据啦。

    情况二:资源内存不足导致优先级低的Activity被系统杀死。

    做过Android开发的童靴都知道,手机本身是有内存限制的,就是我们经常用来描述手机的4G、8G内存,其实手机的内存是指的整个手机,而每个手机上面都会安装很多的APP,所以手机系统分配给每个APP的内存都是有限的,而当一个APP开启了很多Activity的时候,其实每个Activity都是有各种不同状态的,其状态对应的就是运行的优先级,具体来说,Activity的优先级按照从高到低可以分为三种:

    (1)前台Activity —— 当前显示的Activity,正在和用户交互的Activity,其优先级最高。

    (2)可见但是非前台Activity —— 怎么理解可见但是非前台,举一个例子你就明白了,比如我在当前的Activity弹出了一个Dialog,那么此时的Activity就处于可见但非前台,其优先级略低。

    (3)后台Activity —— 不可见Activity,比如我从A跳到B,当B显示后,A就处于后台状态,其优先级最低。

    当系统内存不足的时候,系统会按照优先级的高低来选择杀死哪些Activity,这种情况不太好模拟,但是其执行的生命周期和情况一一样,包括执行的onSaveInstanceState和onRestoreInstanceState方法,这里就不作过多讲解了。

    上面分析了系统的数据的存储和恢复机制,我们知道当系统资源发生改变时Activity就会被销毁重建,那么有没有什么办法可以避免Activity销毁重建呢?答案肯定是可以的,因为系统为我们提供了configChanges属性,用它可以指定在哪些情况下不重建当前的activity。

    configChanges的取值很多,我们列举几个常用的就可以了。

    <1> configChanges = “orientation”

     屏幕方向发生了改变
    

    <2> configChanges = “locale”

     设备的位置发生了改变,一般指切换了语言
    

    <3> configChanges = “keyboardHidden”

     键盘的可访问性发生了改变,比如用户调出了键盘
    

    当然,configChanges可供选择的值远远不只这些,具体可以自行去百度。那么现在我们就来试试当我们设置configChanges = “orientation”时,旋转手机屏幕会发生什么。

    首先在我们的清单文件当中加上这么一句:

    5.png

    运行一下程序看下打印的文件

    6.png

    我们会发现当旋转手机屏幕之后,MainActivity没有做任何动作,MainActivity没有被销毁重建,onSaveInstanceState和onRestoreInstanceState方法也没有被调用。取而代之的是onConfigurationChanged方法被调用,我们可以在这里做我们想要的操作了。

    关于Activity异常情况下的生命周期就分享到这里了,欢迎大家在下面留言评论。

    相关文章

      网友评论

        本文标题:Activity异常情况下的生命周期

        本文链接:https://www.haomeiwen.com/subject/tuygeltx.html