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

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

crash.gif


【封面页】,屏幕方向指定为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图:

crash2.gif

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

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

然后查看logcat:

log.png

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

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

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值