欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-21 12:31:58
...

好好的应用按到华为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方法中。
Only fullscreen opaque activities can request orientation 最好的解析
第一层判定条件:

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

再看一下 isTranslucentOrFloating 的判定源码:
Only fullscreen opaque activities can request orientation 最好的解析
这里面的判定条件有三个都和Style有关:

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

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

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

注意事项:

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

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