【安卓笔记】成长第一步,Activity在正常情况下与异常情况下的生命周期

一:正常情况下Activity所调用的生命周期

(1)onCreate:生命周期的第一个方法,只调用一次,表示Activity正在被创建。在这里我们可以去加载界面或者完成一些初始化操作。

(2)onStart:Activity正在被启动,这时候Activity已经可见了,只是还没有显示在前端,用户看不见,也无法进行交互。

(3)onResume:Activity已经在前台开始活动了,用户可以进行交互。

(4)onPause:Activity暂停,正在停止。正常情况下,onStop方法会紧接着调用。但是在特殊情况下,比如说,在这个时候再迅速回到该Activity,这时候,onStop就不会调用,而是调用onResume方法。当然这种情况很极端,因为从onPause执行完是一瞬间的事情,用户操作很难重现这一场景。此时可以做一些存储,停止动画之类的,不能太耗时。

(5)onStop:Activity停止。用户看不见这个Activity,但是还没有被销毁,可以做一些重量级的回收,存储工作,同样不能太耗时。

(6)onDestroy:Activity即将被销毁,这是Activity最后一个生命周期,可以做一些回收工作和最终的资源释放。

(7)onRestart:从Activity出生到灭亡,不一定会用到这个方法,只有当Activity从不可见变成不可见的时候才会调用这个方法。这种情况一般都是用户操作形成的,比如说,用户按Home键之后回到手机主界面,或者打开一个新的Activity(这时候调用onPause和onStop方法,但如果打开的新Activity采用了透明的主题,就不会调用onStop方法),但是后来又回到这个Activity的时候,onRestart就会调用。


二:异常情况下Activity所调用的生命周期

1.资源相关的系统配置发生改变导致Activity被杀死并重新创建的时候

什么意思呢,就是说由于某些系统配置发生改变导致这个Activity重生了,举个例子,手机在竖屏的情况下显示着一张图片,突然旋转成横屏,这时候系统配置发生了改变,如果这个Activity不重生的话就会在横屏显示竖屏的图片,可能就会有的地方是空白的,所以默认情况下,这个Activity会销毁然后重建,当然我么也可以阻止系统重建Activity。在Activity被销毁的时候,onPause,onStop,onDestroy均会被调用,由于Activity是在异常情况下被销毁的,所以还会在onStop之前调用onSaveInstanceState来保存数据,当Activity被重建的时候,系统会调用onRestoreInstanceState,并把Activity在销毁时,onSaveInstanceState保存的Bundle对象作为参数传给onCreate方法和onRestoreInstanceState方法。

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

Activity的优先级从高到低分为如下三种

(1)前台Activity——与用户交互的Activity,优先级最高

(2)可见但非前台Activity——比如Activity中弹出一个对话框,单只Activity可见但是处于后台无法与用户进行交互

(3)后台Activity——在后台的Activity,被暂停了的,优先级最低

当系统内存不足的时候,系统就会按照优先级去杀死Activity所在的进程,并在后面通过onSaveInstanceState和onRestoreInstanceState来保存和恢复数据。因此,一些后台操作就不适合脱离四大组件去运行,我们一般把后台操作放在Service中,从而保证不被系统轻易的杀死。


如果我们想阻止系统重建我们的Activity,我们可以配置configChanges属性

android:configChanges="orientation"

如果想指定多个值,可以用“|”连接起来

configChanges的项目和含义
项目含义
mccSIM卡唯一标识IMSI(国际移动用户识别码)中的国家代码,由三位数组成,中国为460,此项标识mcc代码发生了改变
mncSIM卡唯一标识IMSI(国际移动用户识别码)中的运营商代码,有两位数组成,中国移动TD系统为00,中国联通为01,中国电信为03.此项标识mnc发生改变
locale设备的本地位置发生了改变,一般指切换了系统语言
touchscreen触摸屏发生了改变,这个很费解,一般不用,可以忽略
keyboard键盘类型发生了改变,比如用户使用了外插键盘
keyboardHidden键盘的可访问性发生了改变
navigation系统导航发生了改变,比如采取了轨迹球导航,费解,忽略
screenLayout屏幕布局发生改变
fontScale系统字体缩放比例发生改变,比如用户换了新字号
uiMode用户界面模式发生了改变,比如用户开启了夜间模式(API8新添加)
orientation屏幕方向发生了改变,这个是用得最多的,旋转屏幕
ScreenSize当屏幕的尺寸信息发生了改变,当旋转屏幕时,屏幕尺寸会发生改变,这个选项比较特殊,它和编译选项有关,当编译选项中的minSdkVersion和targetSdkVersion均低于13时,此选项不会导致Activity重启,否则会导致Activity重启(API13新添加)
smallestScreenSize设备的物理屏幕尺寸发生改变,这个项目和屏幕的方向没有关系,仅仅便是在实际的物理屏幕尺寸改变的时候发生,比如用户切换到了外部显示设备,这个选项和screenSize一样,当编译选项中的minSdkVersion和targetSdkVersion均低于13时,此选项不会导致Activity重启,否则会导致Activity重启(API13新添加)
layoutDirection当布局的方向发生变化,这个属性用得比较少,正常情况下无须修改布局的layoutDirection属性(API17新添加)


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值