OnPause на уровне приложения

Я знаю, что в Android нет onPause на уровне приложения, как у Activity есть onPause, но похоже, что мне нужна аналогичная функциональность. Некоторое время назад я задал (тупой) вопрос (http://stackoverflow.com/questions/9508301/checking-the-manner-in-what-an-activity-has-been-reanimated) и понял, что onPause/onResume даст мне то, что я ищу: возможность узнать, была ли активность переведена в фоновый режим (через кнопку «Домой», открытие другого приложения, спящий режим и т. д.).

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

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

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


person milkboneUnderwear    schedule 05.03.2012    source источник
comment
вы хотите показать активность пароля, когда пользователь нажимает клавишу «назад» или «домой»?   -  person ρяσѕρєя K    schedule 05.03.2012
comment
не задний ключ. даже не ТОЛЬКО домашний ключ. Я хочу, чтобы экран кода доступа появлялся каждый раз, когда приложение покидает передний план или экран гаснет из-за тайм-аута. Я полагал, что onPause/onResume будет работать для этого (и это происходит в рамках одного действия), но я не могу полагаться исключительно на onPause, потому что onPause также срабатывает, когда я перехожу от действия к действию в моем приложении.   -  person milkboneUnderwear    schedule 05.03.2012


Ответы (3)


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

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

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

person Chad Schultz    schedule 05.03.2012
comment
Это кажется интригующим. Вместо того, чтобы устанавливать флаг во всех моих действиях в любой момент, когда пользователь инициирует другое действие, я мог бы создать глобальный класс, который обрабатывает изменения Intent, и установить там флаг. Мне пришлось бы везде обновлять свой код, чтобы заменить стандартную startActivity(intent), но это должно быть меньше работы, чем подход, который я собирался использовать. Я начну копаться в этом, но я боюсь, что столкнусь с проблемами контекста... - person milkboneUnderwear; 05.03.2012

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

person fluffy    schedule 05.03.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;
    }

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

person dhaval    schedule 05.03.2012
comment
Это тоже выглядит хорошо. Я попробую и вернусь сюда, чтобы наградить лучшее решение моей проблемы волшебной зеленой галочкой. - person milkboneUnderwear; 05.03.2012