通常,Android会在onPause
开始被隐藏或隐藏时调用Activity
,然后在onStop
完全不再显示时调用onPause
。在我的游戏中,我在Activity
暂停游戏,因此用户在寻找其他地方时不会丢失游戏。
但是,当用户向下拖动通知栏时,它会覆盖我的onPause
,但onStop
和Activity
都不会被调用。文档中似乎没有提到这一点。游戏在背景中剔除,没有人看着它。有没有其他方法告诉我{{1}}在发生这种情况时被遮挡了,所以我可以在用户输掉之前暂停游戏?我在Android开发者网站上找不到任何相关内容。
答案 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链接以供参考