Activity异常生命周期

一、正常状态下

正常状态下的生命周期如下图,这张图大家都应该看腻了,我就不一一赘述了


二、异常状态下
情况 1 :资源相关的系统配置发生改变导致Activity被杀死并重新创建
比如说当前Activity处于竖屏状态,如果突然旋转屏幕,由于系统配置发生了改变,在默认情况下,Activity就会被销毁并且重新创建,我们也可以阻止系统重新创建该Activity。

在默认情况下,如果我们的Activity不做特殊处理,那么当系统配置发生改变后,Activity就会被销毁并重新创建,其生命周期如图

1)onSaveInstanceState()
当Activity被异常销毁,系统会调用onSaveInstanceState()方法来保存当前Activity的状态,这个方法的调用时机在onStop()之前,和onPause()没有既定的时序关系,可能在之前,也可能在之后调用;

2)onRestoreInstanceState()
Activity被异常销毁后重新创建时,系统调用onRestoreInstanceState(),把onSaveInstanceState()之前所保存的Bundle对象作为参数传给onRestoreInstanceState()和onCreate()方法,进行数据和状态的恢复,按照时序上来说,onRestoreInstanceState()的调用时机在onStart()之后;

3)onCreate()和onRestoreInstanceState()中Bundle savedInstanceState参数的区别
onCreate()调用savedInstanceState参数时需要进行判空处理,因为Activity正常启动时其Bundle参数是为null的,而onRestoreInstanceState()一旦被调用,其参数必定有值; 官方文档建议采用onRestoreInstacneState();

4)注意的点!!!
当Activity被正常销毁,即按照正常的生命周期进行销毁,是不会调用onSaveInstanceState()和onRestoreInstanceState()方法来进行数据的存储和恢复的,即这两个方法只会在Activity即将销毁并且有机会再次显示的情况下才会去调用它,如屏幕旋转等(即系统配置出现改变),其他情况不会调用。

情况 2 :资源内存不足导致低优先级的Activity被杀死
Activity按照优先级从高到低 ,可分为以下3种:
1)前台Activity——正在和用户交互的Activity,优先级最高;

2)可见但非前台Activity————比如Activity中弹出了一个对话框,导致Activity可见但是位于后台无法和用户直接交互

3)后台Activity——已经被暂停的Activity,比如执行了onStop,优先级最低

简述:
在内存不足时,系统会 按照以上优先级顺序去杀死目标Activity所在的进程,并在后续通过onSaveInstanceState()和onRestoreInstanceState()方法来存储和恢复数据。
一个后台进程不适合脱离四大组件在后台独立运行,否则这个进程很容易被系统杀掉; 比较好的方法就是把后台的工作放入到Service中从而保证进程有一定的优先级

当系统配置发生改变时,不重新创建Activity:
可在对应的Activity的注册项中指定configChanges的属性保证在系统配置改变后不重新创建Activity,如屏幕旋转不重新创建Activity:
android :configChanges= "orientation"
可以用 “ | ” 符号连接多个值,系统配置项目及其含义如下:

在指定配置属性后,Activity将不会重新被创建,即 不会执行情况1的生命周期,即 不会调用onSaveInstanceState()和onRestoreInstanceState()方法,但是Activity会调用 onConfigurationChanged()方法,我们可以在这里做一些特殊处理。

猜你喜欢

转载自blog.csdn.net/li527425/article/details/80910545