每次设备进入此模式时,沉浸式模式指令都会重新出现

时间:2013-11-19 15:07:31

标签: android android-4.4-kitkat

我的应用通过调用(在onCreate中)使用新的“沉浸式模式”:

getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);

这很好用,但每次启动活动时都会显示“操作方法”弹出窗口(“从顶部向下滑动以退出全屏”)(如果在活动显示时手机被锁定),甚至虽然用户已经确认了弹出窗口。据我所知,弹出窗口是由系统自动生成的,所以我无法改变这种情况,对吗?

此问题可重现如下:

  1. 启动沉浸式活动[不显示弹出窗口,仅在第一次启动时出现(正确)]
  2. 在活动显示时按电源按钮关闭屏幕
  3. 再次按电源按钮以打开屏幕
  4. 通过调用finish()关闭活动,例如从按钮或菜单选项
  5. 再次启动活动 - 弹出窗口重新出现
  6. 如果活动启动,关闭和重新启动而不点击其间的电源按钮,则弹出窗口不会重新出现。此外,只有在按下电源按钮时活动位于最顶层时,它才会重新出现。

    更正:需要通过调用“finish()”(例如,从按钮或菜单选项)关闭活动。如果活动被反键关闭,它可以正常工作。

    我在这里上传了一个示例应用:https://github.com/niko001/com.greatbytes.immersivebug/tree/master/Test5

    编辑:现在有一个Xposed module来禁用“恐慌模式”,所以我想我并不是唯一一个看到这是一个烦恼的人;)

2 个答案:

答案 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中,如果符合以下条件,用户将在进入沉浸式模式时看到确认:

  • 他们尚未确认该应用程序(包)。
  • 他们&#34;惊慌失措&#34;上次他们处于沉浸式模式。 &#34;恐慌&#34;在这种情况下意味着关闭屏幕,然后在5秒内(默认情况下)重新开启。