真的很有趣的问题!感谢您的明确指示,重现该问题不是问题。
好吧,在挖了将近30分钟的源码,说why would they do this?
了一堆之后,我想我终于明白了。我会尽力解释,但这只是我的解释,可能不正确:
android 的某个人意识到沉浸式模式会让人们陷入恐慌状态:how do i exit? (_sorry, I don't know what else the panic would be about_)
.
在这种恐慌状态下,用户将转向电源按钮
.... > 电源按钮 --> 用户关闭屏幕(x
自 EPOCH 以来的毫秒数)
.... > 祈祷导航栏回来
.... > 电源按钮 --> 用户打开屏幕(y
自 EPOCH 以来的毫秒数)
现在,持续时间y - x
很重要。我们稍后会讨论它,但首先,让我们看看它是如何panic
定义的:
panic
Praying the navigation bar comes back
持续时间少于 5 秒时发生。该值由以下人员持有:
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 < mPanicThresholdMs) ==> ( y - x ) < 5000
unconfirmPackage(mPanicPackage)
从mPanicPackage
存储在Settings.Secure.IMMERSIVE_MODE_CONFIRMATIONS
.
不用说,我觉得这很奇怪……而且是错误的。即使用户处于恐慌状态,并采用电源按钮路线,她/他也不会在下次启动之前看到有用的提醒。那么,有什么意义呢?
或者可能是,我对恐慌的定义是错误的。
所以我无法改变这种情况,对吗?
正确的。要解决此问题,您必须将您的包名称添加到Settings.Secure.IMMERSIVE_MODE_CONFIRMATIONS
. 但是,要写入安全设置,您的应用程序需要WRITE_SECURE_SETTINGS
权限 - 不供第三方应用程序使用。
链接:
ImmersiveModeConfirmation(管理确认提示的显示/隐藏的帮助类)