У меня на таймере есть заставка. Моя проблема в том, что перед finish()
тем, как приступить к выполнению своего действия, мне нужно проверить, что следующее действие началось, потому что всплывает системное диалоговое окно, и я только хочу finish()
; после того, как пользователь выбрал опцию в диалоговом окне?
Я знаю, что есть много вопросов о том, как узнать, находится ли ваше действие на переднем плане, но я не знаю, позволяет ли это также создавать диалоговые окна поверх действия.
Вот в чем проблема, красный цвет - это моя активность, которая находится в фоновом режиме, а диалог находится на переднем плане:
РЕДАКТИРОВАТЬ: Я пытался просто не использовать, finish()
но затем моя деятельность может быть возвращена в стек приложений, которых я пытаюсь избежать.
Ответы:
Вот что рекомендуется в качестве правильного решения:
В своем
finish()
методе вы хотите использовать,isActivityVisible()
чтобы проверить, видно ли действие или нет. Там вы также можете проверить, выбрал ли пользователь вариант или нет. Продолжайте, когда оба условия будут выполнены.Источник также упоминает два неправильных решения ... так что избегайте этого.
Источник: stackoverflow
источник
onPause
,onStop
, ниonResume
событие называется. Так что же делать, если ни одно из этих событий не сработало ?!Если ориентирован на уровень API 14 или выше, можно использовать android.app.Application.ActivityLifecycleCallbacks
источник
UPD : обновлено до гос
Lifecycle.State.RESUMED
. Спасибо за это @htafoya .В 2019 году с помощью новой библиотеки поддержки
28+
или AndroidX вы можете просто использовать:Вы можете прочитать больше в документации, чтобы понять, что произошло под капотом.
источник
activity.lifecycle.currentState.isAtLeast(Lifecycle.State.RESUMED)
или НАЧАТЬ.INITIALIZED
не гарантирует, что он находится на переднем плане.Activity :: hasWindowFocus () возвращает вам необходимое логическое значение.
Вот пример класса для проверки видимости ваших действий, где бы вы ни находились.
Помните, что если вы показываете диалог , результат будет ложным, так как диалог будет иметь основной фокус. В остальном это действительно удобно и надежнее предлагаемых решений.
источник
Именно разница между
onPause
иonStop
событиями деятельности , как описано в документации о классе активности .Если я правильно вас понял, вы хотите позвонить
finish()
из своей деятельности,onStop
чтобы прекратить ее. См. Прикрепленное изображение демонстрационного приложения жизненного цикла деятельности . Вот как это выглядит, когда действие B запускается из действия A. Порядок событий - снизу вверх, поэтому вы можете видеть, что действие AonStop
вызывается после того, как действие BonResume
уже было вызвано.В случае отображения диалогового окна, ваша активность в фоновом режиме неактивна и
onPause
вызывается только .источник
Два возможных решения:
1) Обратные вызовы Activity LifeCycle
Используйте приложение , реализующее ActivityLifecycleCallbacks и используйте его для отслеживания событий жизненного цикла в вашем приложении. Обратите внимание, что ActivityLifecycleCallbacks предназначены для Android api> = 14. Для предыдущего Android api вам нужно будет реализовать его самостоятельно во всех ваших действиях ;-)
Используйте приложение, когда вам нужно поделиться / сохранить состояния в разных действиях.
2) Проверьте информацию о запущенном процессе
Вы можете проверить статус запущенного процесса с помощью этого класса RunningAppProcessInfo
Получите список запущенных процессов с помощью ActivityManager.getRunningAppProcesses () и отфильтруйте список результатов, чтобы проверить наличие желаемого RunningAppProcessInfo и проверить его «важность»
источник
У меня есть проект на github app-foreground-background-listen
который использует очень простую логику и отлично работает со всеми уровнями Android API.
источник
Используйте временной интервал между паузой и возобновлением из фона, чтобы определить, не спит ли он из фона
В пользовательском приложении
В классе BaseActivity
источник
Думаю, у меня есть решение получше. Потому что вы можете просто встроить MyApplication.activityResumed (); на каждое действие на одну степень.
Сначала вам нужно создать (например, CyberneticTwerkGuruOrc)
Затем вам нужно добавить класс приложения в AndroidManifest.xml
Затем создайте класс ActivityBase
Наконец, когда вы создаете новый Activity, вы можете просто расширить его с помощью ActivityBase вместо Activity.
Для меня это лучший метод, потому что вам нужно просто помнить о расширении с помощью ActivityBase. Кроме того, в будущем вы можете расширить свою базовую функцию. В моем случае я добавил приемники для своей службы и оповещения о сети в один класс.
Если вы хотите проверить видимость своего приложения, вы можете просто позвонить
источник
Этого можно добиться эффективным способом, используя Application.ActivityLifecycleCallbacks.
Например, возьмем имя класса Activity, поскольку ProfileActivity позволяет определить , находится ли он на переднем или в заднем плане.
сначала нам нужно создать наш класс приложения, расширив Application Class
который реализует
Давайте будем моим классом приложения следующим образом
Класс приложения
в приведенном выше классе есть метод переопределения onActivityResumed для ActivityLifecycleCallbacks
где можно найти все экземпляры активности, которые в настоящее время отображаются на экране, просто проверьте, отображается ли ваша активность на экране, указанным выше методом.
Зарегистрируйте свой класс приложения в manifest.xml
Чтобы проверить, активна ли погода на переднем плане или в фоновом режиме, в соответствии с приведенным выше решением, вызовите следующий метод в местах, которые вам нужно проверить
источник
Если вы хотите знать, отображается ли на экране какое-либо действие вашего приложения, вы можете сделать что-то вроде этого:
Просто создайте синглтон этого класса и установите его в своем экземпляре приложения, как показано ниже:
Затем вы можете использовать метод isAnyActivityVisible () своего экземпляра MyAppActivityCallbacks везде!
источник
вы пытались не вызывать finish и указывать в манифесте «android: noHistory =« true »? Это предотвратит попадание активности в стек.
источник
Я должен сказать, что ваш рабочий процесс отличается от стандартного для Android. В Android вам не нужно
finish()
ваше действие, если вы хотите открыть другое действие из Intent. Что касается удобства пользователя, Android позволяет пользователю использовать клавишу «назад», чтобы вернуться из активности, которую вы открыли в своем приложении.Так что просто позвольте системе остановить вашу активность и сохранить все, что нужно, когда ваша активность будет отозвана.
источник
Сохраните флаг, если вы приостановили или возобновили. Если вы возобновили, значит, вы на переднем плане
источник
Одним из возможных решений может быть установка флага при отображении системного диалога, а затем в методе onStop жизненного цикла активности проверить флаг, если он истинен, завершить действие.
Например, если системный диалог запускается нажатием какой-нибудь кнопки, то слушатель onclick может быть похож на
и при остановке деятельности:
источник
Почему бы не использовать для этого трансляции? второе действие (то, которое должно быть активировано) может отправлять локальную трансляцию следующим образом:
затем напишите простой приемник внутри всплеска:
и зарегистрируйте новый приемник в LocalBroadcastManager, чтобы прослушивать трансляцию вашего второго действия:
ЗАМЕТЬТЕ, что вы можете использовать константу или строковый ресурс для строки «широковещательного идентификатора».
источник
LocalBroadcastManager
здесьЕсли вы используете
finish()
только для того, чтобы новое приложение не запускалось в стеке (задаче) вашего приложения, вы можете использоватьIntent.FLAG_ACTIVITY_NEW_TASK
флаг при запуске нового приложения и не вызывать егоfinish()
вообще. Согласно документации , это флаг, который будет использоваться для реализации поведения стиля «пусковая установка».источник
Используйте эти методы внутри файла
Activity
.isDestroyed()
isFinishing()
Распространенной ошибкой
AsyncTask
является захват сильной ссылки на хостActivity
(илиFragment
):Это проблема, потому что
AsyncTask
может легко пережить родителяActivity
, например, если изменение конфигурации происходит во время выполнения задачи.Правильный способ сделать это - сделать вашу задачу
static
классом, который не захватывает родительский элемент и содержит слабую ссылку на хостActivity
:источник
Вот решение с использованием
Application
класса.Вы можете просто использовать его следующим образом:
Если у вас есть ссылка на требуемое Activity или используется каноническое имя Activity, вы можете узнать, находится оно на переднем плане или нет. Это решение не может быть надежным. Поэтому ваши комментарии действительно приветствуются.
источник
Я не знаю, почему никто не говорил о sharedPreferences для Activity A, устанавливая такой SharedPreference (например, в onPause ()):
Я считаю, что это надежный способ отслеживать активность на виду.
источник
Было
Activity.onWindowFocusChanged(boolean hasFocus)
бы здесь полезно? Это, а также флаг уровня класса, что-то вродеisFocused
этогоonWindowFocusChanged
, было бы простым способом определить в любой момент вашей деятельности, сфокусирован он или нет. Читая документы, похоже, что он правильно установил бы «false» в любой ситуации, когда действие не находится непосредственно на физическом «переднем плане», например, если отображается диалоговое окно или панель уведомлений опускается.Пример:
источник
Если вы используете EventBus , это как вызываемый метод,
hasSubscriberForEvent
который можно использовать для проверкиActivity
, сфокусирован ли объект .источник
Раньше я любил,
если активность не на переднем плане
вернет ноль. : = P
источник