Уровень приложения onPause - PullRequest
3 голосов
/ 05 марта 2012

Я знаю, что у Android нет onPause уровня приложения, как у Activity с onPause, но, похоже, мне нужна аналогичная функциональность.Я задал (немой) вопрос некоторое время назад (/4446514/proverka-sposoba-reanimirovaniya-deistviya)) и понял, что onPause / onResume даст мне то, что я ищу: возможность узнать, было ли действие перенесено в фоновый режим (либо с помощью кнопки Home, открываядругое приложение, телефон спит и т. д.).

Проблема в том, что onPause также запускается в Activity, когда я перехожу из одной Activity в моем приложении в другое. Поэтому я иду по пути поискаКАЖДЫЙ ЕДИНСТВЕННЫЙ способ, которым пользователь может перейти от Активности к Активности в моем приложении (а их от 15 до 25) и установить флаг непосредственно перед каждым инициируемым пользователем переключателем Активности. Затем в onResume я проверяю этот флагэто X, я знаю, что это было инициированное пользователем onResume. Если флаг Y, я знаю, что это результат нажатия кнопки «Домой», спящего телефона и т. д.).

Это только кажетсякак большой грязный клудж.Есть ли способ лучше?

(Я добавляю это, чтобы помочь, чтобы не путать: моя цель - иметь (очень раздражающий, я знаю) экран с паролем, который появляется каждый раз, когда приложение уходит с переднего плана по любой причине (даже экран)sleep). Я планировал использовать onPause / onResume, чтобы проверить, когда вывести действие Passcode, но onPause срабатывает каждый раз, когда я изменяю Activity, и поэтому мне нужно добавить больше.)

Ответы [ 3 ]

0 голосов
/ 05 марта 2012

Приложения, такие как Pinnacle Locker, делают нечто подобное - я полагаю, что они перехватывают Intent для определенных пакетов и, таким образом, запускаются всякий раз, когда система переключается на приложение, но не когда пользователь переключает экраны между приложениями.

Возможно, я вас неправильно понимаю, но другой подход заключается в том, чтобы перевернуть ваш подход: когда вы переходите с одного экрана на другой в приложении, вы запускаете Intent или finish () (например, когда пользователь нажимает кнопку назад), верно?

Тогда вы можете установить флаг в ваших внутренних Intents, и всякий раз, когда вы напрямую вызываете finish () или когда вызывается onBackPressed () в ваших приложениях, вы можете установить аналогичный флаг. Если этот флаг не установлен при запуске onResume () в вашем приложении, вы можете показать экран блокировки.

0 голосов
/ 05 марта 2012

Вам следует объединить функцию onPause () со статусом видимости приложения и продолжить процесс, если ваше приложение не видно.Следующий код может помочь:

private boolean isVisible(String app) {
        ActivityManager activityManager = (ActivityManager) getApplicationContext()
                .getSystemService(Context.ACTIVITY_SERVICE);
        List<RunningAppProcessInfo> appProcesses = activityManager
                .getRunningAppProcesses();
        for (RunningAppProcessInfo appProcess : appProcesses) {
            if (appProcess.importance == RunningAppProcessInfo.IMPORTANCE_VISIBLE) {
                Log.i("Foreground App", appProcess.processName);
                if (app.equalsIgnoreCase(appProcess.processName)) {
                    return true;
                }
            }
        }

        return false;
    }

Опять же, это может не полностью соответствовать вашему текущему сценарию.

0 голосов
/ 05 марта 2012

Это на самом деле не отвечает на ваш вопрос, но, возможно, в качестве альтернативного подхода, вы могли бы создать базовый класс действий, который управляет флагами и унаследовал от этого все ваши действия? Вы могли бы даже сделать что-то вроде установки тайм-аута, скажем, 5 секунд между onPause одного действия и onResume другого действия, чтобы решить, что вы выполняете переключение вне приложения вместо переключения внутри приложения, хотя, если у вас просто есть служебная функция, которую вы вызываете из базового класса активности для инициирования изменения активности, которая все еще значительно уменьшает площадь, где вы должны отслеживать вещи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...