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

it2023-02-14  88

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

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

解决方案:

适配版本不大于26(显然不合适)不设置 windowIsTranslucentwindowSwipeToDismisswindowIsFloating 为 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方法中。 第一层判定条件:

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

再看一下 isTranslucentOrFloating 的判定源码: 这里面的判定条件有三个都和Style有关:

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

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

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

注意事项:

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

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

最新回复(0)