Android 丨 个别机型横竖屏切换崩溃

Posted 左郁

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 丨 个别机型横竖屏切换崩溃相关的知识,希望对你有一定的参考价值。

出错机型:华为p20
测试场景:屏幕方向指定,书封页竖屏展示,阅读页横屏展示,从阅读页返回书封页的时候出现以下问题:
书封页显示竖屏–横屏–竖屏–App崩溃重启


【封面页】,屏幕方向指定为portrait,其在androidManifest.xml中声明如下:

  <activity
            android:name=".activity.CoverPageActivity"
            android:screenOrientation="portrait"/>

【阅读页】,屏幕方向指定为不会参照物理方向传感器,其声明如下:

  <activity
            android:name=".activity.ReaderActivity"
            android:screenOrientation="nosensor"/>

在大部分手机上测试都符合正常现象:阅读页横屏状态下点击返回按钮,返回封面页,屏幕由横屏切换为竖屏。一切都符合程序员的思维逻辑,~~然而,在华为p20上居然崩溃了,
查看log发现:在返回【封面页】的时候,先销毁了【封面页】,然后重新创建了一个【封面页】,在重新创建的时候由于对资源没处理好,导致程序崩溃。

于是在【封面页】的AndroidMainifest.xml中配置android:configChanges,设置切屏不会重新调用各个生命周期

android:configChanges="orientation|screenSize|keyboardHidden"

对android:configChanges属性,一般认为有以下几点:
1.未设置Activity的 android:configChanges 时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次
2.设置Activity的 android:configChanges=“orientation” 时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
3.设置Activity的 android:configChanges=“orientation|keyboardHidden” 时,切屏不会重新调用各个生命周期,只会执行 onConfigurationChanged 方法

但是,自从Android 3.2(API 13),
在设置Activity的 android:configChanges=“orientation|keyboardHidden” 后,还是一样会重新调用各个生命周期的。因为screen size也开始跟着设备的横竖切换而改变。
所以,在AndroidManifest.xml里设置的MiniSdkVersion和 TargetSdkVersion属性大于等于13的情况下,如果你想阻止程序在运行时重新加载Activity,除了设置"orientation",你还必须设置"ScreenSize"。


重新运行,崩溃解决了,但是横竖屏切换的问题还是存在。。。此处有gif图:

在【阅读页】,点击返回按钮返回上个界面【书封页】,此时【书封页】是竖屏的,随即切换为横屏,然后又切换为竖屏
在【封面页】打印日志如下:

override fun onConfigurationChanged(newConfig: Configuration?) 
        super.onConfigurationChanged(newConfig)
        //0--undefined,1--portrait,2--landscape
        Log.e(TAG, "onConfigurationChanged: " + newConfig?.layoutDirection)
    

然后查看logcat:

发现是在【阅读页】调用onDestroy后,【封面页】回调了两次onConfigurationChanged,而且打出的getLayoutDirection居然都是未定义0。
结合刚刚上面的Gif图,【封面页】明明已经切换为竖屏了(其生命周期已经是onResume了),后面还切换了两次屏幕,就对应上这里的两次回调。那不让其回调不就不会出现上述问题了?
接着尝试:在【阅读页】的onDestroy中添加如下代码

 @Override
    protected void onDestroy() 
        //@modify 针对一些手机切换到上个界面后,横竖屏多次切换的问题
        this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
       ... ...


然后重新运行,问题解决了

以上是关于Android 丨 个别机型横竖屏切换崩溃的主要内容,如果未能解决你的问题,请参考以下文章

如何让Android横竖屏切换时不销毁当前activity

android知识点

android怎么设置横竖屏切换

Android横竖屏切换小结

Android 横竖屏切换

Android 切换横竖屏