我的应用通过调用(在onCreate
中)使用新的“沉浸式模式”:
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
这很好用,但每次启动活动时都会显示“操作方法”弹出窗口(“从顶部向下滑动以退出全屏”)(如果在活动显示时手机被锁定),甚至虽然用户已经确认了弹出窗口。据我所知,弹出窗口是由系统自动生成的,所以我无法改变这种情况,对吗?
此问题可重现如下:
如果活动启动,关闭和重新启动而不点击其间的电源按钮,则弹出窗口不会重新出现。此外,只有在按下电源按钮时活动位于最顶层时,它才会重新出现。
更正:需要通过调用“finish()”(例如,从按钮或菜单选项)关闭活动。如果活动被反键关闭,它可以正常工作。
我在这里上传了一个示例应用:https://github.com/niko001/com.greatbytes.immersivebug/tree/master/Test5
编辑:现在有一个Xposed module来禁用“恐慌模式”,所以我想我并不是唯一一个看到这是一个烦恼的人;)
答案 0 :(得分:36)
非常有趣的问题!由于您的明确指示,复制问题不是问题。
好吧,经过近30分钟的挖掘,并多次说why would they do this?
,我想我终于明白了。我会尝试尽我所能解释,但这只是我的解释,可能不正确:
有人在android 意识到,沉浸式模式会让人们陷入恐慌状态:how do i exit? (_sorry, I don't know what else the panic would be about_)
。
在这种恐慌状态下,用户将转向POWER BUTTON
....>电源按钮 - >用户关闭屏幕(自EPOCH以来x
毫秒)
....>祈祷导航栏回来了
....>电源按钮 - >用户打开屏幕(自EPOCH以来y
毫秒)
现在,持续时间y - x
具有重要意义。我们稍后会讨论它,但首先,我们来看看如何定义panic
:
panic
持续时间少于5秒时,会发生{p> Praying the navigation bar comes back
。该值由以下人员持有:
mPanicThresholdMs = context.getResources()
.getInteger(R.integer.config_immersive_mode_confirmation_panic);
<!-- Threshold (in ms) under which a screen off / screen on will be considered
a reset of the immersive mode confirmation prompt.-->
<integer name="config_immersive_mode_confirmation_panic">5000</integer>
啊,好的。因此,如果用户已经确认一次并不重要,如果满足上述标准,则提示将返回 - 即使在第100次发布时也是如此。
这就是行动发生的地方:
public void onPowerKeyDown(boolean isScreenOn, long time, boolean inImmersiveMode) {
if (mPanicPackage != null && !isScreenOn && (time - mPanicTime < mPanicThresholdMs)) {
// turning the screen back on within the panic threshold
unconfirmPackage(mPanicPackage);
}
if (isScreenOn && inImmersiveMode) {
// turning the screen off, remember if we were in immersive mode
mPanicTime = time;
mPanicPackage = mLastPackage;
} else {
mPanicTime = 0;
mPanicPackage = null;
}
}
(时间 - mPanicTime&lt; mPanicThresholdMs)==&gt; (y - x)&lt; 5000 强>
unconfirmPackage(mPanicPackage)
从mPanicPackage
下存储的包列表中删除Settings.Secure.IMMERSIVE_MODE_CONFIRMATIONS
(您的)。
毋庸置疑,我觉得这很奇怪......而且错了。即使用户处于恐慌状态并采用电源按钮路线,他/她也不会在下次启动之前看到有用的提醒。那么,有什么意义呢?
或者可能是,我对恐慌的定义是错误的。
所以我无法改变这种情况,对吗?
正确。要解决此问题,您必须将package-name添加到Settings.Secure.IMMERSIVE_MODE_CONFIRMATIONS
所持有的值。但是,要写入安全设置,您的应用需要WRITE_SECURE_SETTINGS
权限 - 不得供第三方应用使用。
链接:
ImmersiveModeConfirmation (helper class that manages showing/hiding of confirmation prompt)
答案 1 :(得分:3)
更简洁 - 在K中,如果符合以下条件,用户将在进入沉浸式模式时看到确认: