好好的应用按到华为8.0上就崩溃了,感觉非常无语,解决的时候,查了一下资料发现虽然很多人都遇见过,但是总结的并不全面,有一些还是有问题的。所以特意将这个崩溃,从源码级别给大家分析一下,让大家知其然,知其所以然。
先上解决方案,后面是源码级的触发原理。
首先我们先看下:Only fullscreen opaque activities can request orientation
没错仅需要这两个条件即可在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,并请求方向就会崩溃!