Как определить, когда панель уведомлений / системная панель открыта

Мне нужно было знать, когда в моем приложении открывается панель системы/уведомлений, и я не мог найти никаких реальных решений, поэтому я взломал что-то вместе, что, похоже, работает довольно хорошо.


person The Hungry Androider    schedule 27.11.2018    source источник


Ответы (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);
    }
}
person The Hungry Androider    schedule 27.11.2018