Activity的生命周期全面分析

      本次分析是将Activity的生命周期分为两种情况,一种是典型情况下的生命周期,一种是异常情况下的生命周期。所谓的典型情况下的生命周期,是指有用户参与的情况下,Activity所经历的生命周期的改变。而异常情况下的生命周期是指Activity被系统回收或者由于当前设备的configuration发生改变而导致Activity被销毁重建,异常情况下Activity生命周期关注点和典型情况下略有不同。

  一、典型情况下的生命周期

     正常情况下,Activity都会经历如下生命周期

      (1)onCreate()  表示Activity正在被创建,是生命周期中的第一个方法,在这里我们可以做一些初始化操作,比如调用SetContentView()去加载布局,或说初始化数据之类的。

<2> onRestart()  表示Activity正在被重新启动,一般情况下,当当前Activity从不可见重新变为不可见状态时,onRestart就好呗调用。这种情形一般是用户行为所导致的,比如用户按Home键切换到桌面或者用户打开了一个新的Activity,这是当前的Activity就会被暂停,也就是onPause和onStop就执行了,接着用户又回到了这个Activity,就会出现这种情况。

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

(3)  onResume()  表示Activity已经可见了,并且出现在前台并开始活动。要注意这个和onStart的对比,onStart和onResume都表示Activity已经可见,但是onStart的时候Activity还在后头,onResume的时候Activity才显示到前台。

(4)  onPause()  表示Activity正在停止,正常情况下,紧挨着onStop就会被调用。在特殊情况下,如果这个时候快速地再回到当前Activity,那么onResume会被调用。笔者的理解的是,这种情况属于极端情况,用户操作很难重新这一场景。此时可以做一些存储数据、停止动画等工作,但是注意不能太耗时,因为这会影响到新的Activity 的显示,onPause必须先执行完,新Activity 的onResume才会执行。

(5)  onStop()  表示Activity即将停止,可以做一些稍微重量级的回收工作,同样不能太耗时。

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

正常情况下Activity的生命周期只有上面7个。

再说几种情况

1,正常Activity被启动,经历的过程是 onCreate-onStart-onResume

2.  用户切换到新的Activity或者按了home键, onPause-onStop

3.用户按了back回退键,onPause-onStop-onDestroy

4,用户重新返回Activity ,onRestart-onStart-onResume

      

二、异常情况下的生命周期分析

下面我们分析两种情况

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

          比如当前的Activity处于竖屏状态下,我们突然旋转屏幕切换到横屏,由于系统资源配置的改变,Activity就会被杀死并且重新创建,当然我们也可以阻止系统重新创建我们的Activity。

    当系统配置发生改变时,Activity会被杀死,相继调用onPause  onStop   onDestroy 方法,但是由于是异常杀死,因此还会在onStop之前调用onSaveInstance 来保存当前Activity的状态,至于是在onPause之前还是之后执行,没有既定的答案,需要强调的一点是,这个方法只有在Activity被异常终止的时候才会执行,正常情况下,系统不会回调这个方法。当Activity被重新创建之后,系统会调用onRestoreInstanceState,并且把Activity销毁是onSaveInstanceState方法所保存的Bundle 对象作为参数同时传递给onRestoreInstanceState和onCreate方法。因此,我们可以通过onRestoreInstanceState和onCreate方法来判断Activity是否被重建了,如果被重建了,那么我们就可以取出之前保存的数据并恢复,从时序上来说,onRestoreInstanceState的调用时机在onStart之后。

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

        这种情况我们不好模拟,但是其数据存储和恢复过程和情况一完全一致。这里我们描述一下Activity的优先级情况。Activity按照优先级从高到低,可以分为三种:

        (1)前台Activity——正在和用户交互的Activity,优先级最高。
(2)可见但非前台Activity——比如Activity中弹出了一个对话框,导致Activity可见但是位于后台无法和用户直接交互。
(3)后台Activity——已经被暂停的Activity,比如执行了onStop,优先级最低。
当系统内存不足时,系统就会按照上述优先级去杀死目标Activity所在的进程,并在后续中通过onSaveInstanceState和onRestoreInstanceState来存储和恢复数据。如果一个进程中没有四大组件在执行,那么这个进程将很快被系统杀死,因此,一些后台工作不合适脱离四大组件而独自运行在后台中,这样进程很容易被杀死。比较好的方法是将后台工作放入Service中从而保证进程有一定的优先级,这样就不会轻易的被系统杀死。

     如果我们在系统配置发生改变后,不想让Activity被重新创建,也是有办法的,可以给Activity指定configChanges属性。比如不想让Activity在屏幕旋转的时候重新创建,就可以给configChanges属性添加orientation这个值,如下所示。

  Android:confingChanges=“orientation”
     如果我们想指定多个值,可以用“|”连接起来,比如android:configChanges=“orientation|keyboardHidden”。系统配置中所含的项目是非常多的,下面介绍每个项目的含义。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值