Activity生命周期回调

今天来看看Activity生命周期回调第二部分

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

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

典型情况是 用户横竖屏变换,系统配置会发生改变,默认情况下Activity会被销毁并重建(我们也可以阻止系统重新创建我们的Activity)。默认情况下,如果Activity不做特殊处理,那么当系统配置发生改变后,Activity就会被销毁重建,生命周期如下


此时,Activity的onPause、onStop、onDestroy都会被调用,因为Activity是在异常情况下终止的,系统会调用onSaveInstanceState来保存当前Activity的状态。这个方法的调用时机是在onStop之前,但它和onPause没有既定的时序关系。强调一点,该方法只会在异常终止情况下调用,正常情况下不会调用。当Activity被重新创建后,系统会调用onRestoreInstanceState,并吧Activity销毁时onSaveInstanceState方法所保存的Bundle对象作为参数传递给onRestoreInstanceState和onCreate方法。在这两个方法中,我们可以判断Activity是否被重建,从而取出数据并恢复。从时序上来说,onRestoreInstanceState的调用时机在onStart之后。

在onSaveInstanceState以及onRestoreInstanceState方法中,系统自动帮我们做了一定的恢复工作。在被重建时,系统会默认为我们保存当前的视图结构,并在重启后为我们恢复这些数据(比如文本框用户输入的数据,ListView滚动的位置等)。但每个特定的View系统能为我们恢复哪些数据,可以查看对应View的源码,每个View都有onSaveInstanceState以及onRestoreInstanceState方法。

View层次的保存以及恢复 工作流:Activity意外终止,Activity委托window保存数据 window 委托顶级容器 ViewGroup (可能是个DecorView  灿岩的博客 深入理解Decorview) ,ViewGroup在一一通知子元素保存数据。Activity - Window -ViewGroup - View子元素。


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

这种情况的保存以及恢复跟情况1 完全一致。主要看看Activity的优先级情况

扫描二维码关注公众号,回复: 1105123 查看本文章

(1)前台Activity  

(2)可见但是非前台(如Activity弹出对话框,导致Activity可见,但是无法进行直接交互)

(3)后台Activity,已经被暂停的Activity

系统内存不足时,会按照上述优先级杀死目标Activity所在的进程。并在后续通过onSaveInstanceState以及onRestoreInstanceState方法来存储以及恢复数据。如果一个进程没有四大组件在执行,那么将很快被系统杀死。


如何保证不重新创建呢?

可以给Activity指定configChanges属性 如:不想再旋转屏幕时重建,就可以添加 orienttation这个值 可以添加多个值,用 | 来连接。

系统配置中包含的项目及其意义:可以查看Android configChanges的属性值和含义(详细)

在设置了configChanges要求旋转屏幕不进行重建时,系统不会重建Activity,并且不会调用onSaveInstanceState以及onRestoreInstanceState方法,系统取而代之调用了Activity的onConfigurationChanged方法,这时我们可以做一些自己的特殊处理。

猜你喜欢

转载自blog.csdn.net/feelinghappy/article/details/80360189