Activity的生命周期和启动模式(一)

来源:互联网 发布:马贩子科尔哈斯 知乎 编辑:程序博客网 时间:2024/05/16 18:09

Activity生命周期全面分析

1.典型情况下的生命周期分析

(1)onCreate() :表示Activity正在被创建,生命周期的第一个方法,在这个方法中可以做一些初始化工作,比如调用setContentView去加载界面布局资源,初始化Activity所需数据

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

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

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

(5)onPause:表示Activity正在被停止,正常情况下,紧接着onStop就会被调用,这个方法不能太耗时,因为会影响到新Activity的显示,onPause必须执行完,新Activity的onResume才会执行

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

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

这里写图片描述

针对上图,分如下几种情况:

(1)针对一个特定的Activity,第一次启动,回调如下:onCreate->onStart->onResume

(2)当用户打开新的Activity或者切换到桌面的时候,回调如下:onPause->onStop

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

(4)当用户按back键回退时,回调如下:onPause->onStop->onDestroy

(5) onCreate和onDestroy是配对的,分别标识着Activity的创建和销毁。
onStart和onStop是配对的:Activity是否可见
onStart是可见的,onStop是不可见的

onResume和onPause是配对的:Activity是否位于前台
onResume是位于前台的,onPause是位于后台的

2.异常情况下的生命周期分析

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

比如说当前Activity处于竖屏状态,如果突然旋转屏幕,由于系统配置发生了变化,Activity就会被销毁并且重新创建

Activity——>onSaveInstanceState——>onDestroy

重新创建:

Activity——>onCreate——>onRestoreInstanceState

当系统配置发生改变后,Activity会被销毁,其onPause、onStop、onDestroy均会被调用,同时由于Activity是在异常情况下终止的,系统会调用onSaveInstanceState来保存当前Activity的状态。这个方法的调用是onStop之前。当Activity被重新创建后,系统会调用onRestoreInstanceState,并且把Activity销毁时所保存的Bundle对象作为参数同时传递给onRestoreInstanceState和onCreate方法。因此,我们可以通过onRestoreInstanceState和onCreate方法来判断Activity是否被重建了,如果被重建了,那么我们可以取出之前保存的数据并恢复,onRestoreInstanceState调用时机在onStart之后。

onSaveInstanceState和onRestoreInstanceState方法中,系统自动为我们做了一定的恢复工作。当Activity在异常情况下需要重新创建时,系统会默认为我们保存当前Activity的视图结构,并且在Activity重启后为我们恢复这些数据,比如文本框中用户输入的数据、ListView滚动的位置等,这些View相关的状态系统都能默认为我们恢复。

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

Activity的优先级从高到低,可以分为三种:

  • 前台Activity——正在和用户交互的Ativity,优先级最高
  • 可见但非前台Activity——比如Activity中弹出了一个对话框,导致Activity可见但是位于后台无法和用户交互
  • 后台Activity——已经暂停的Activity,比如执行了onStop,优先级最低

当系统内存不足时,系统就会按照上述优先级去杀死目标Activity所在的进程,并在后续通过onSaveInstanceState和onRestoreInstanceState来存储和恢复数据。如果一个进程中没有四大组件在执行,那么这个进程将很快被系统杀死,因此,一些后台工作不适合脱离四大组件而独自运行在后台中,这样很容易被杀死。比较好的方法是将后台工作放入Service中从而保证进程有一定的优先级,这样就不会轻易被系统杀死。

系统配置中有很多内容,如果某项内容发生改变后,我们不想系统重新创建Actitvity,可以给Activity指定configChanges属性。如果我们想指定多个值,可以用“|”连接起来,系统配置中所含的项目非常多

项目 含义 mcc SIM卡唯一标识IMSI(国际移动用户识别码)中的国家代码由3位数字组成,中国为460 mnc SIM卡唯一标识IMSI(国际移动用户识别码)中的运营商代码,由两位数字组成,中国移动为00,中国联通为01,中国电信为03 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新添加)
原创粉丝点击