Мне нужно было знать, когда в моем приложении открывается панель системы/уведомлений, и я не мог найти никаких реальных решений, поэтому я взломал что-то вместе, что, похоже, работает довольно хорошо.
Как определить, когда панель уведомлений / системная панель открыта
Ответы (1)
Прежде чем приступить к реализации, я дам краткое объяснение моей (очень хакерской) логики. Когда действие больше не видно пользователю по какой-либо причине, вызывается onWindowFocusChanged(..). Однако onStop() вызывается только тогда, когда активность больше не видна пользователю, перейдя в фоновый режим. Я заметил, что при переключении действий onStop() всегда вызывается после onWindowFocusChanged(..), поэтому я добавил проверку onWindowFocusChanged(..), чтобы увидеть, был ли уже вызван onStop() (с задержкой в 1 секунду), и Я сделал это, используя статический член. Теперь о том, как...
Вам понадобится родительская активность, которую расширяют все активности в вашем приложении. В этом родительском действии добавьте этот статический элемент:
private static boolean wasOnStopCalledAfterOnWindowFocusChanged;
Затем в вашем методе onStop() добавьте эту строку, убедитесь, что вы вызываете ее ДО super.onStop()
@Override
protected void onStop() {
wasOnStopCalledAfterOnWindowFocusChanged = true;
super.onStop();
}
Наконец, вам нужно переопределить onWindowFocusChanged(..) в этом родительском действии и добавить приведенную ниже логику.
@Override
public void onWindowFocusChanged(boolean hasFocus) {
if (!hasFocus) {
new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
@Override
public void run() {
if (!wasOnStopCalledAfterOnWindowFocusChanged) {
// NOTIFICATION BAR IS DOWN...DO STUFF
}
wasOnStopCalledAfterOnWindowFocusChanged = false;
}
}, 1000);
}
}