一.Android切换横竖屏
- 应用的横竖屏设置
应用的横竖屏设置主要是通过Activity的screenOrientation
属性控制,属性值如下:
主要有以下两种方式设置screenOrientation
属性值
- 静态设置,即在Mainfest文件中配置
screenOrientation
属性 - 动态设置,即调用Activity的
setRequestedOrientation(@ActivityInfo.ScreenOrientation int requestedOrientation)
方法设置screenOrientation
属性值
以上两种方法,均可以通过改变screenOrientation
属性值的方式配置屏幕方向属性,人为的限制屏幕可自动选择或者锁定横竖屏。只不过动态设置可以通过动态的改变屏幕方向属性值的方式,从而动态的设置屏幕方向
-
系统的横竖屏设置
以三星手机为例:
系统横竖屏设置可以设置自动旋转(即应用界面根据系统自动旋转)或者锁定某一方向的屏幕
综上,系统的设置和应用的属性共同控制了屏幕的横竖展示。
这里做了个简单的表格,列出一些常用系统横竖屏和应用横竖屏混合设置结果(自动旋转代表会根据手机设备的旋转而旋转):
screenOrientation属性值 | default | sensor | protrait | landscape |
---|---|---|---|---|
系统自动旋转 | 自动旋转 | 自动旋转 | 锁定竖屏 | 锁定横屏 |
系统锁定竖屏 | 锁定竖屏 | 自动旋转 | 锁定竖屏 | 锁定横屏 |
总结:根据实际测试的结果可知,应用的属性约束优先级要大于系统设置的约束,只有应用属性screenOrientation
属性值为默认值时(不设置),应用的横竖屏才受系统自动旋转设置约束。只要screenOrientation
属性值不为默认值,应用界面的横竖屏切换只受当前Activity的screenOrientation
属性控制。
二.Android横竖屏切换Activity生命周期
关于Android横竖屏切换Activity是否会销毁重建,这个由Activity的configChanges
属性控制。当一个配置改变时Activity默认会销毁重建,但是如果这个属性声明了此项配置后,Activit就不会销毁重建,而是回调Activity的onConfigurationChanged
方法。
configChanges
的可配置属性如下:
- 横竖屏切换 - Activity销毁重建
对于android3.2(API13)及以后的系统,以下任意一种配置,横竖屏切换Activity的生命周期都会重新执行一次
(备注:关于部分资料说的不配置orientation属性切换竖屏会执行两次的结论,我在4.0之后的手机上测试都是只执行一次,不知道之前版本的系统是不是这样,待验证)
- 不配置
configChanges
属性 - 设置
android:configChanges="orientation"
- 设置
android:configChanges="orientation|keyboardHidden"
(3.2系统之前的系统不会执行生命周期方法了)
实测结果:
可见以上三种配置,横竖屏切换时Activity均会销毁重建,Activity的生命周期都会重新执行一次
- 横竖屏切换 - Activity不销毁重建
配置android:configChanges="orientation|keyboardHidden|screenSize"
可以控制Activity在横竖屏切换时不销毁重建
实测结果:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
int orientation = newConfig.orientation;
if (orientation == ORIENTATION_LANDSCAPE){
Log.i(TAG, "-------------横屏-------------");
}else {
Log.i(TAG, "-------------竖屏-------------");
}
Log.i(TAG, "onConfigurationChanged: "+orientation);
}
可见配置了android:configChanges="orientation|keyboardHidden|screenSize"
横竖屏切换时Activity不会销毁重建,而是会回调Activity的onConfigurationChanged方法。这里需要注意的是,第一次切换时onConfigurationChanged方法会回调两次
总结:在遇到Android横竖屏切换的问题时,我们需要解决的问题主要有两个,布局的变化和数据的存储恢复。可以综合以上的属性设置达到最终自己想要的效果。
·