Android 横竖屏切换总结

一.Android切换横竖屏

  1. 应用的横竖屏设置
    应用的横竖屏设置主要是通过Activity的screenOrientation属性控制,属性值如下:
    Android 横竖屏切换总结

主要有以下两种方式设置screenOrientation属性值

  • 静态设置,即在Mainfest文件中配置screenOrientation属性
  • 动态设置,即调用Activity的setRequestedOrientation(@ActivityInfo.ScreenOrientation int requestedOrientation)方法设置screenOrientation属性值

以上两种方法,均可以通过改变screenOrientation属性值的方式配置屏幕方向属性,人为的限制屏幕可自动选择或者锁定横竖屏。只不过动态设置可以通过动态的改变屏幕方向属性值的方式,从而动态的设置屏幕方向

  1. 系统的横竖屏设置
    系统横竖屏设置可以设置自动旋转(即应用界面根据系统自动旋转)或者锁定某一方向的屏幕

    以三星手机为例:
    Android 横竖屏切换总结
    自动旋转
    Android 横竖屏切换总结
    锁定竖屏

综上,系统的设置和应用的属性共同控制了屏幕的横竖展示。
这里做了个简单的表格,列出一些常用系统横竖屏和应用横竖屏混合设置结果(自动旋转代表会根据手机设备的旋转而旋转):

screenOrientation属性值 default sensor protrait landscape
系统自动旋转 自动旋转 自动旋转 锁定竖屏 锁定横屏
系统锁定竖屏 锁定竖屏 自动旋转 锁定竖屏 锁定横屏

总结:根据实际测试的结果可知,应用的属性约束优先级要大于系统设置的约束,只有应用属性screenOrientation属性值为默认值时(不设置),应用的横竖屏才受系统自动旋转设置约束。只要screenOrientation属性值不为默认值,应用界面的横竖屏切换只受当前Activity的screenOrientation属性控制。

二.Android横竖屏切换Activity生命周期

关于Android横竖屏切换Activity是否会销毁重建,这个由Activity的configChanges属性控制。当一个配置改变时Activity默认会销毁重建,但是如果这个属性声明了此项配置后,Activit就不会销毁重建,而是回调Activity的onConfigurationChanged方法。

configChanges的可配置属性如下:

Android 横竖屏切换总结

  1. 横竖屏切换 - Activity销毁重建
    对于android3.2(API13)及以后的系统,以下任意一种配置,横竖屏切换Activity的生命周期都会重新执行一次
    备注:关于部分资料说的不配置orientation属性切换竖屏会执行两次的结论,我在4.0之后的手机上测试都是只执行一次,不知道之前版本的系统是不是这样,待验证
  • 不配置configChanges属性
  • 设置android:configChanges="orientation"
  • 设置android:configChanges="orientation|keyboardHidden"(3.2系统之前的系统不会执行生命周期方法了)

实测结果:

Android 横竖屏切换总结

可见以上三种配置,横竖屏切换时Activity均会销毁重建,Activity的生命周期都会重新执行一次

  1. 横竖屏切换 - 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 横竖屏切换总结

可见配置了android:configChanges="orientation|keyboardHidden|screenSize"横竖屏切换时Activity不会销毁重建,而是会回调Activity的onConfigurationChanged方法。这里需要注意的是,第一次切换时onConfigurationChanged方法会回调两次

总结:在遇到Android横竖屏切换的问题时,我们需要解决的问题主要有两个,布局的变化和数据的存储恢复。可以综合以上的属性设置达到最终自己想要的效果。

·