Activity异常情况下的生命周期

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

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

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

首先我们来看一下异常情况下Activity的生命周期执行情况:
在这里插入图片描述

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

这个代码很简单,就是在onSaveInstanceState里面存一个key为name,值为stevens的数据,
然后在onRestoreInstanceState里面拿出这个数据,注意需要进行非空判断,现在运行程序看看打印的结果。
在这里插入图片描述

发现没有,发现没有,我们真的在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”时,旋转手机屏幕会发生什么。

首先在我们的清单文件当中加上这么一句:
在这里插入图片描述

运行一下程序看下打印的文件
在这里插入图片描述

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值