如何告知活动已被通知区域覆盖?

时间:2012-10-02 11:32:15

标签: android android-notification-bar

通常,Android会在onPause开始被隐藏或隐藏时调用Activity,然后在onStop完全不再显示时调用onPause。在我的游戏中,我在Activity暂停游戏,因此用户在寻找其他地方时不会丢失游戏。

但是,当用户向下拖动通知栏时,它会覆盖我的onPause,但onStopActivity都不会被调用。文档中似乎没有提到这一点。游戏在背景中剔除,没有人看着它。有没有其他方法告诉我{{1}}在发生这种情况时被遮挡了,所以我可以在用户输掉之前暂停游戏?我在Android开发者网站上找不到任何相关内容。

3 个答案:

答案 0 :(得分:14)

onWindowFocusChanged(boolean hasFocus)的{​​{1}}应符合要求的目的。拖动通知区域时会调用Activity,而一旦区域被拖回,就会调用false。相应的Android documentation表示此方法"是此活动对用户是否可见的最佳指标" 。它还明确指出,当显示"状态栏通知面板" 时会触发回调。

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

在类似于此问题中描述的方案中,我们已成功使用AlertDialog方法,例如在Android 4.4的Nexus 5或Android 4.1的索尼Xperia平板电脑上。

答案 1 :(得分:3)

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

如果可行,你可以deactivate the statusbar。否则,我认为你运气不好:(

答案 2 :(得分:1)

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

案例1 如果您的活动已隐藏状态栏,并且用户点按状态栏区域但未通过向下拉显示通知区域,则可以通过注册监听器以获得系统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值为“false”,并且当用户按下状态栏时自动调用相同的方法;但是使用'true'hasFocus值

@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);

}

查看this链接以供参考