15

通常,当它开始被遮盖或隐藏时,Android 会调用onPause您,然后是当它不再显示时。在我的游戏中,我在 中暂停游戏,这样用户在寻找其他地方时不会输掉游戏。ActivityonStoponPause

但是,当用户向下拖动通知栏时,它会覆盖 my Activity,但既不调用onPause也不onStop调用。文档中似乎没有提到这一点。游戏在后台滴答作响,没有人看它。发生这种情况时,是否有其他方法可以告诉我 Activity已被遮挡,以便我可以在用户输掉之前暂停游戏?我在 Android 开发者网站上找不到任何关于此的内容。

4

3 回答 3

22

的应该服务于所需的目的onWindowFocusChanged(boolean hasFocus)Activityfalse在通知区域被向下拖动时调用,当区域被向上拖动时调用true。相应的Android 文档指出,此方法“是该活动是否对用户可见的最佳指标”。它还明确指出,当显示“状态栏通知面板”时会触发回调。

需要注意的是,在其他情况下也会调用此方法。一个很好的例子是AlertDialog. onWindowFocusChanged甚至在活动本身显示AlertDialog. 这可能需要考虑,具体取决于您的游戏是否使用 AlertDialogs 或其他导致焦点更改的东西。

在与此问题中描述的场景类似的场景中,我们onWindowFocusChanged成功地使用了该方法,例如在装有 Android 4.4 的 Nexus 5 或装有 Android 4.1 的 Sony Xperia Tablet 上。

于 2014-12-05T10:32:22.750 回答
4

由于StatusBarManager不是官方 API 的一部分,我发现不太可能有检测它的方法。即使使用反射,状态栏类似乎都没有监听器的钩子。

如果可行,您可以停用 statusbar。否则,我认为你不走运:(

于 2012-10-02T11:41:45.917 回答
3

与状态栏交互有两种情况:

  • 案例1:如果你的activity已经隐藏了状态栏,并且用户在没有显示通知的情况下拉下状态栏区域:这可以通过注册OnSystemUiVisibilityChangeListener监听器来获得系统UI可见性变化的通知来处理
    boolean mStatusBarShown;
    View decorView = getWindow().getDecorView();
    decorView.setOnSystemUiVisibilityChangeListener
            (new View.OnSystemUiVisibilityChangeListener() {
                @Override
                public void onSystemUiVisibilityChange(int visibility) {
                    // Note that system bars will only be "visible" if none of the
                    // LOW_PROFILE, HIDE_NAVIGATION, or FULLSCREEN flags are set.
                    if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {
                        // TODO: The system bars are visible. Make any desired
                        // adjustments to your UI, such as showing the action bar or
                        // other navigational controls.
                        mStatusBarShown = true;

                    } else {
                        // TODO: The system bars are NOT visible. Make any desired
                        // adjustments to your UI, such as hiding the action bar or
                        // other navigational controls.
                        mStatusBarShown = false;

                    }
                }
            });
  • 情况2:如果状态栏已经显示给用户,用户拉下显示通知区域;要检测到这一点,您需要onWindowFocusChanged(boolean hasFocus)在活动中进行覆盖,其中hasFocus参数值将是“假”,以防用户拉下状态栏,以及当用户再次向上推状态栏时;然后onWindowFocusChanged将再次调用,但这次hasFocus将是true
    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        // handle when the user pull down the notification bar where
        // (hasFocus will ='false') & if the user pushed the
        // notification bar back to the top, then (hasFocus will ='true')
        if (!hasFocus) {
            Log.i("Tag", "Notification bar is pulled down");
        } else {
            Log.i("Tag", "Notification bar is pushed up");
        }
        super.onWindowFocusChanged(hasFocus);
    
    }

检查链接以获取更多信息。

于 2018-06-07T17:38:15.390 回答