Only fullscreen opaque activities can request orientation 最好的解析

好好的应用按到华为8.0上就崩溃了,感觉非常无语,解决的时候,查了一下资料发现虽然很多人都遇见过,但是总结的并不全面,有一些还是有问题的。所以特意将这个崩溃,从源码级别给大家分析一下,让大家知其然,知其所以然。

先上解决方案,后面是源码级的触发原理。

解决方案:
  1. 适配版本不大于26(显然不合适)
  2. 不设置
  • windowIsTranslucent
  • windowSwipeToDismiss
  • windowIsFloating
    true

首先我们先看下:Only fullscreen opaque activities can request orientation

必现条件:
  <activity
            android:name=".MainActivity"
            android:configChanges="orientation|screenSize"
            android:screenOrientation="landscape"
            android:theme="@style/ActivityTheme">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    <style name="ActivityTheme" parent="Theme.AppCompat.NoActionBar">
        <item name="android:windowIsTranslucent">false</item>
    </style>

没错仅需要这两个条件即可在8.0上发生这个崩溃。

官方源码判定条件:

根据崩溃日志:

 Caused by: java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation
        at android.app.Activity.onCreate(Activity.java:1081)
        at androidx.core.app.ComponentActivity.onCreate(ComponentActivity.java:85)
        at androidx.activity.ComponentActivity.onCreate(ComponentActivity.java:149)
        at androidx.fragment.app.FragmentActivity.onCreate(FragmentActivity.java:313)
        at androidx.appcompat.app.AppCompatActivity.onCreate(AppCompatActivity.java:115)
        at com.xjl.screenrotationtest.MainActivity.onCreate(MainActivity.kt:28)

可以知道,崩溃点发生在Activity的onCreate方法中。
在这里插入图片描述
第一层判定条件:

  1. 适配的版本大于26
  2. 请求了屏幕方向

再看一下 isTranslucentOrFloating 的判定源码:
在这里插入图片描述
这里面的判定条件有三个都和Style有关:

  1. 当前Window是否是透明的 :windowIsTranslucent
  2. 当前Window是否是右滑退出 :windowSwipeToDismiss
  3. 当前Window是否是悬浮的 :windowIsFloating

如果你抱有怀疑态度,那么我已经为大家实验过了,实验结果非常的准确。

只要我们设置了屏幕方向,并在Style中出现以上三个属性之一并设置为true时就会发生这个崩溃。

注意事项:

虽然报错信息是 Only fullscreen opaque activities can request orientation 但是从源码中我们可以知道和是否全屏是没有关系的!

经测试适配版本大于26时不管是否开启windowFullscreen属性只要windowIsTranslucent为true,并请求方向就会崩溃!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值