设备横竖屏切换的前置条件:设备开了 '自动旋转'
背景:在安卓设备上,几乎任何与用户交互的场景呈现,均需要依附一个Activity实例,而Activity的生命周期,在正常不做任何处理下【清单文件和代码均未做处理】是受到设备的横竖屏切换影响的。
表现为:横竖屏切换时,Activity会经历onDestroy-->onCreate,意味着当前的Activity在销毁后重建了。如果该Activity承载的数据比较大【例如UI复杂、业务数据处理量大】,当设备的性能跟不上时,这种情况下,横竖屏切换过程中会引起黑屏迹象或者出了某些问题。
如何规避横竖屏切换时,Activity销毁重建问题?这里列举两种方法:
1、在清单文件上,给该Activity注册时,添加
android:configChanges="orientation|keyboardHidden|screenSize" 属性即可。
在这种情形下,如果该Activity存在业务想要适配横竖屏变化的,需要在该Activity源码文件中,重写 onConfigurationChanged()方法 (这个方法是监听横竖屏切换时回调的一个方法),做相应的业务/逻辑适配即可。例如,有的业务要求横竖屏分别展示不同的UI效果的,建议在res下分别建layout-land和layout-port两个文件夹,把横屏和竖屏的布局文件放入对应的layout文件夹中【布局文件名尽量要一致】
2、在清单文件中该Activity注册时,添加
android:screenOrientation="xx" 属性来指定Activity方向 (例如是竖屏portrait或者横屏landscape)或者在源代码中调用了setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE 或SCREEN_ORIENTATION_PORTRAIT)方法显式指定了方向 (两处都设置了-以代码里设置的为准)
这样配置后该Activity的生命周期和方向均不受设备横竖屏切换影响。第二种方式,无法适配横竖屏下不同的样式呈现。适合比较单一UI呈现的场景。
选择哪种方式,需要根据自身业务来决定。
总结影响:
1、对Activity生命周期有影响,需适配
2、对自定义相机预览画面【如拍照、录像、直播推流场景】有很大影响,需要做很多纠正工作。
如果想少做工作,建议相机预览页面,固定一个Activity方向。
3、如果有业务想要实现Activity方向随用户调整设备方向变化而变化,一般是通过清单
配置该Activity的属性:android:screenOrientation="fullSensor" 或在该Activity创建时onCreate
方法中调用 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR)
即可。该方法无需关注设备的 “自动旋转” 开关是否开启。如果业务要适配横竖屏,适配工作是
少不了的。