大家都知道手机旋转屏幕的时候activity会重启,安卓提供两种方式来处理配置变化。
1.保留一个配置对象
一般是使用onSaveInstanceState()的Bundle对象进行数据传递,还可以使用ViewModel对象,后面再作分析。
2.自定义配置变化
如果你的程序在特殊的配置变化时不需要更新资源,你可以自己处理配置变化,防止系统重启你的activity,虽然系统并不推荐这么做。
你需要在activity的配置文件中申明android:configChanges属性,属性值代表你想自己处理的配置变化。通常有orientation, screenSize, keyboardHidden。你可以使用 | 来表示想要处理多个配置。
<activity android:name=".appresources.CustomConfigurationChange"
android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"
android:launchMode="singleInstance"
android:taskAffinity=""/>
那么当其中一个配置信息发生变化之后,系统会调用onConfiguraionChanged()函数,这个函数传递一个Configuration的对象表示新设备的配置。通过读取Configuration的属性,你可以知道新的配置信息,从而做出相关的更新。
写一个Activity文件,实现各个回调函数,在每个回调函数中加一个log,使用自定义的Log系统就可以在手机上看到相关回调的输出。
源码在appresources目录里面。
当旋转屏幕的时候可以看做只有onConfigurationChanged()函数被回调,横屏使用land表示,竖屏使用port表示。
2018-10-19 13:09:11.056 14802-14802/com.android.guide D/ConfigurationChange:
onConfigurationChanged: {1.0 460mcc11mnc [en_US] ldltr sw360dp w360dp
h616dp 320dpi nrml long port finger -keyb/v/h -nav/h s.70 themeChanged=0
themeChangedFlags=0}