Как определить, когда открыто уведомление / системная панель - PullRequest
0 голосов
/ 28 ноября 2018

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

1 Ответ

0 голосов
/ 28 ноября 2018

Прежде чем приступить к реализации, я кратко объясню мою (очень хакерскую) логику.Когда действие по какой-либо причине перестает быть видимым для пользователя, вызывается onWindowFocusChanged (..).Однако onStop () вызывается только тогда, когда действие больше не отображается для пользователя при переходе в фоновый режим.Я заметил, что при переключении Activity onStop () всегда вызывается после onWindowFocusChanged (..), поэтому я добавил проверку onWindowFocusChanged (..), чтобы увидеть, был ли уже вызван onStop () (с задержкой в ​​1 секунду), иЯ сделал это с помощью статического члена.Теперь для получения инструкций ...

Вам понадобится родительское действие, которое расширяет все действия в вашем приложении.В этом родительском действии добавьте этот статический член:

private static boolean wasOnStopCalledAfterOnWindowFocusChanged;

Затем в методе onStop () добавьте эту строку, убедитесь, что вы вызываете ее ПЕРЕД super.onStop ()

@Override
protected void onStop() {
    wasOnStopCalledAfterOnWindowFocusChanged = true;
    super.onStop();
}

Наконец, вам нужно переопределить onWindowFocusChanged (..) в этом родительском Activity и добавить следующую логику.

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