Activity的生命周期全面分析
2017-07-19 10:20
232 查看
本次分析是将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”。系统配置中所含的项目是非常多的,下面介绍每个项目的含义。
一、典型情况下的生命周期
正常情况下,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”。系统配置中所含的项目是非常多的,下面介绍每个项目的含义。
项目 | 含义 |
mcc | sim卡唯一标识IMSI(国际移动用户识别码)中的国家代码,由三位数字组成,中国为460,此项标识mcc代码发生了改变。 |
mnc | sim卡唯一标识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新添加) |
相关文章推荐
- Activity的生命周期和启动模式--Activity的生命周期的全面分析
- android开发艺术探索 学习笔记(一) Activity生命周期全面分析
- Activity的生命周期全面分析
- Activity的生命周期全面分析
- Android-Activity的生命周期全面分析
- Activity的生命周期全面分析
- 第1章 Activity的生命周期和启动模式 1.1 Activity的声明周期全面分析
- 【Android - 组件】之Activity生命周期的全面分析
- Activity的生命周期全面分析
- Activity的生命周期全面分析
- Android 中Activity生命周期分析:Android中横竖屏切换时的生命周期过程
- Android Activity的生命周期与异常生命周期的分析
- Activity基础篇之异常情况下生命周期分析
- Activity生命周期要点分析
- android开发艺术探索 2 Activity异常情况下的生命周期分析
- Activity的正常和异常生命周期分析
- 一张图帮你分析activity与fragment的生命周期及其他们的关系
- 生离死别之Activity生命周期测试及结果分析
- Activity 生命周期分析
- 横竖屏切换时候Activity的生命周期的总结--绝对全面