关于onConfigurationChanged方法及常见问题解决

 *本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 

1、public void onConfigurationChanged(Configuration newConfig)方法介绍

newConfig:新的设备配置信息

当系统的配置信息发生改变时,系统会调用此方法。注意,只有在配置文件AndroidManifest中处理了configChanges属性对应的设备配置,该方法才会被调用。如果发生设备配置与在配置文件中设置的不一致,则Activity会被销毁并使用新的配置重建。

例如:

当屏幕方向发生改变时,Activity会被销毁重建,如果在AndroidManifest文件中处理屏幕方向配置信息如下


则Activity不会被销毁重建,而是调用onConfigurationChanged方法。

如果configChanges只设置了orientation,则当其他设备配置信息改变时,Activity依然会销毁重建,且不会调用onConfigurationChanged。

例如,在上面的配置的情况下,如果语言改变了,Acitivyt就会销毁重建,且不会调用onConfigurationChanged方法。


2、configChanges设置取值

关于onConfigurationChanged方法及常见问题解决_第1张图片



注意:横竖屏切换的属性是orientation。如果targetSdkVersion的值大于等于13,则如下配置才会回调onConfigurationChanged方法

 android:configChanges="orientation|screenSize"
如果targetSdkVersion的值小于13,则只要配置
  android:configChanges="orientation"

就可以了。

网上有很多文章写说横竖屏切换时onConfigurationChanged方法没有调用,使用如下的配置

android:configChanges="orientation|keyboard|keyboardHidden"
但是!!!其实查官方文档,只要配置 android:configChanges="orientation|screenSize"就可以了。


扩展:

当用户接入一个外设键盘时,默认软键盘会自动隐藏,系统自动使用外设键盘。这个过程Activity的销毁和隐藏执行了两次。并且onConfigurationChanged()周期不会调用。

但是在配置文件中设置android:configChanges="keyboardHidden|keyboard"。当接入外设键盘或者拔出外设键盘时,调用的周期是先调用onConfigurationChanged()周期后销毁重建。

在这里有一个疑点,为什么有两次的销毁重建?

其中一次的销毁重建可以肯定是因为外设键盘的插入和拔出。当设置android:configChanges="keyboardHidden|keyboard"之后,就不会销毁重建,而是调用onConfigurationChanged()方法。

但是还有一次销毁重建一直存在。

经过测试,当接入外设键盘时,除了键盘类型的改变,触摸屏也发生了变化。因为使用外设键盘,触摸屏不能使用了。(如果是接入触摸板,不知道会不会有这个问题?欢迎大家提供意见)。这里,我接入的是键盘,所以触摸屏不能使用了。

总结:

如果是键盘类型发生了改变,则configChanges属性配置如下Activity才不会销毁重建,且回调onConfigurationChanged方法

关于onConfigurationChanged方法及常见问题解决_第2张图片



note:这里的外置物理键盘可以是游戏手柄、扫描枪、键盘等等。

总结:

设备配置的更改会导致Acitivity销毁重建,而设置android:configChanges则避免Activity销毁重建,系统会回调onConfigurationChanged方法。


官方文档:

https://developer.android.com/guide/topics/manifest/activity-element.html






你可能感兴趣的:(Android笔记)