屏幕旋转后Activity生命周期

主要针对屏幕旋转对 Activity 生命周期有何影响。

第一种情况

在没有其它配置的情况下,通过日志打印屏幕旋转会调用的方法。

1
//onPause()----onStop()-----onDestroy()-----onCreate() ---- onStart()---onResume()

第二种情况

关于 android:configChanges 的配置,不同的值对生命周期也会有不同的影响。这个值最常用的值包括: orientationkeyboardHidden, 分别用于避免因屏幕方向和可用键盘改变而导致的重启。

例如:

1
2
<activity android:name=".MainActivity"
android:configChanges="orientation|keyboardHidden" / >

当其中一个配置发生变化时, MainActivity 不会重启。 但是会收到 onConfigurationChanged() 的调用。向此方法传递 Configuration 对象指定新设备配置。可以通过读取 Configuration 中的字段,确定新配置。然后通过更新界面中使用的资源进行适当的更改。调用此方法时,Activity 的 Resources 对象会相应的进行更新,以根据新配置返回资源,这样,就能够在系统不重启 Activity 的情况下轻松重置 UI 的元素。

但是,我的编译版本高一些,实验,发现当配置以上configChanges 还是会重启 Activity, 并且没有回调 onConfigurationChanged() 的回调

而后,开始查阅文档说明,发现:

1
注意: 在Android3.2(API 13)开始,当设备在纵向和横向之间切换时, “屏幕尺寸”也会发生改变,因此,在开发针对 API 13或者更高版本的应用时(当然我们现在基本都是4.0 以上),若要避免由于设备方向改变而导致运行时重启,则除了 "orientation" 值以外,还必须添加 "screenSize" 值, 也就是说,您必须声明:android:configChanges="orientation|screenSize".

当添加新的配置 screenSize 之后,屏幕旋转回调如下:

1
// onConfigurationChanged invoked... 只会调用onConfigurationChanged() 方法,并没有重启

最后就是一些资源的变更,如果有些图像应该在横向和纵向之间切换,就必须在 onConfigurationChanged() 期间将每个资源重新分配给每个元素。

文档地址:https://developer.android.com/guide/topics/resources/runtime-changes?hl=zh-cn

-------------本文结束感谢您的阅读-------------