Only fullscreen opaque activities can request orientation 原因及解决方案

今天在三星S8上遇见一个奇葩问题Only fullscreen opaque activities can request orientation

一、出现场景

  • 三星手机S8 android 8.0
  • targetSdkVersion 27
  • 透明Activity

二、解决方案

manifest中移除android:screenOrientation="portrait"

三、原因(源码中寻找)

查看Android 8.0源码

3.1、ActivityRecord#setRequestedOrientation

 

有几个条件:

  • 非全屏 !fullscreen
  • targetSdkVersion的设置为大于26 appInfo.targetSdkVersion > O
  • ActivityInfo.isFixedOrientation(requestedOrientation)

所以下边来跟踪一下ActivityInfo.isFixedOrientation(requestedOrientation)

3.2、跟踪ActivityInfo.isFixedOrientation(requestedOrientation)

继续跟踪isFixedOrientationPortrait(int orientation)

最后的原因找到了,就是因为orientation == SCREEN_ORIENTATION_PORTRAIT

3.3、总结一下

  • 如果一个 targetSdkVersion>26的Android App
  • 运行在Android 8.0(含) 以上的设备上时
  • 如果启动的Activity为透明Activity

screenOrientation 需为默认状态

四、Google为什么这么做?

在 stackoverflow 中看到一句话。

这句话,我在google官方文档上并没有找到依据,但经过我的验证是正确的

If you use a fullscreen transparent activity, there is no need to specify the orientation lock on the activity. It will take the configuration settings of the parent activity. So if the parent activity has in the manifest:

这种情况下,透明Activity使用的是栈中,上一层可见Activity的orientation设定。仔细想一想是合理的,因此这并不是一个bug。

五、最后重申一遍解决方案

综上所述,移除android:screenOrientation="portrait" 的解决方案,完全符合Google的设计本意,并非Bug

 

 转自:https://www.cnblogs.com/xiaxveliang/p/12396098.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值