Есть ли простой способ определить, активна ли определенная деятельность? Я хочу делать определенные вещи в зависимости от того, какая деятельность активна. например:
if(activityrunning == activity1)
//do this
else if (activityrunning == activity2)
//do something else
android
android-activity
user560571
источник
источник
Ответы:
Вы можете использовать
static
переменную в деятельности.Единственный недостаток в том, что если вы используете его в двух действиях, которые связаны друг с другом, то
onStop
первое вызывается послеonStart
второго. Так что оба могут быть правдой кратко.В зависимости от того, что вы пытаетесь сделать (обновить текущую активность из службы?). Вы можете просто зарегистрировать статический прослушиватель в службе в вашем
onStart
методе активности, тогда правильный слушатель будет доступен, когда ваша служба захочет обновить пользовательский интерфейс.источник
MyActivity
сMyChildactivity
и хотите проверить , если ребенок активен?Я понимаю, что эта проблема довольно старая, но я думаю, что все же стоит поделиться своим решением, поскольку оно может быть полезным для других.
Это решение не было доступно до выпуска компонентов архитектуры Android.
Активность хотя бы частично видна
Деятельность на переднем плане
источник
Я думаю, что более ясно, как это:
источник
Опция без использования вспомогательной переменной:
где активность fe: this или getActivity ().
Значение, возвращаемое этим выражением, изменяется в onStart () / onStop (), которые являются событиями, которые запускают / останавливают показ макета действия на телефоне.
источник
Activity#getWindow().getDecorView().isShown()
?Я использовал метод MyActivity.class и getCanonicalName и получил ответ.
источник
getRunningTasks()
как это было устаревшим: androidxref.com/9.0.0_r3/xref/frameworks/base/core/java/android/...Гораздо лучший способ, чем использовать статическую переменную и следовать ООП
Shared Preferences
может использоваться для обмена переменными с другимиactivities
и службами из одногоapplication
Используйте общие настройки. У него самая достоверная информация о состоянии, меньше проблем с переключением / уничтожением приложений, что избавляет нас от необходимости запрашивать еще одно разрешение и дает нам больше контроля над тем, когда наша деятельность на самом деле самая высокая. см подробности здесь ABD здесь также
источник
onStop()
Это код для проверки того, запущена ли конкретная служба. Я вполне уверен, что он может работать и для действия, если вы измените getRunningServices с помощью getRunningAppProcesses () или getRunningTasks (). Посмотрите здесь http://developer.android.com/reference/android/app/ActivityManager.html#getRunningAppProcesses ()
Измените Constants.PACKAGE и Constants.BACKGROUND_SERVICE_CLASS соответственно
источник
Существует гораздо более простой способ, чем все вышеперечисленное, и этот подход не требует использования
android.permission.GET_TASKS
в манифесте, или не имеет проблемы условий гонки или утечек памяти, указанных в принятом ответе.Создайте переменную STATIC в основной Деятельности. Статический позволяет другим действиям получать данные от другого действия.
onPause()
установите эту переменную false ,onResume
иonCreate()
установите эту переменную true .Назначьте методы получения и установки этой переменной.
А потом из другой деятельности или службы
источник
Из официальных документов:
Занятие isFinishing ()
Занятие isDestroyed ()
источник
спасибо ккуди! Я смог адаптировать ваш ответ для работы для деятельности ... вот что сработало в моем приложении ...
этот пример даст вам true или false, если topActivity соответствует тому, что делает пользователь. Поэтому, если активность, которую вы проверяете, не отображается (то есть включена), вы не получите совпадения. Кроме того, для этого вам нужно добавить разрешение в манифест.
Я надеюсь, что это было полезно!
источник
Я думаю, что принятый ответ - ужасный способ справиться с этим.
Я не знаю, каков вариант использования, но, пожалуйста, рассмотрите защищенный метод в базовом классе
и переопределить его в производном классе.
Когда событие происходит, просто вызовите этот метод в базовом классе. Правильный «активный» класс будет обрабатывать это тогда. Сам класс затем может проверить, если это не так
Paused()
.Еще лучше использовать шину событий, такую как GreenRobot , Square , но она устарела и предлагает использовать RxJava
источник
Я использовал чек,
if (!a.isFinishing())
и он, кажется, делает то, что мне нужно.a
это экземпляр активности. Это неверно? Почему никто не попробовал это?источник
что о
activity.isFinishing()
источник
ActivityLifecycleCallbacks - отличный способ отслеживать все действия в приложении:
ActivityState:
Расширьте класс Application и предоставьте его ссылку в файле Android Manifest:
Нажмите в любом месте активность для статуса другой активности:
https://developer.android.com/reference/android/app/Application.ActivityLifecycleCallbacks.html
источник
Не уверен, что это «правильный» способ «делать вещи».
Если нет API-способа решения вопроса (или), чем вы должны немного подумать, возможно, вы делаете что-то неправильно и вместо этого читаете больше документов и т. Д.
(Как я понял, статические переменные - это, как правило, неправильный путь в Android. это может сработать, но определенно будут случаи, когда он не будет работать [например, на производстве, на миллионах устройств]).
Именно в вашем случае я предлагаю подумать, зачем вам знать, живо ли другое действие? .. Вы можете запустить другое действие для результата, чтобы получить его функциональность. Или вы можете получить класс, чтобы получить его функциональность и так далее.
Наилучшие пожелания.
источник
Если вас интересует состояние жизненного цикла конкретного экземпляра действия, решение силикона выглядит правильно, за исключением того, что новая «активная» переменная должна быть переменной экземпляра, а не статической.
источник
Используйте заказанную трансляцию. См. Http://android-developers.blogspot.nl/2011/01/processing-ordered-broadcasts.html.
В своей деятельности зарегистрируйте получателя в onStart, отмените регистрацию в onStop. Теперь, когда, например, службе необходимо обработать что-то, что активность может сделать лучше, отправьте заказанную рассылку из службы (с обработчиком по умолчанию в самой службе). Теперь вы можете отвечать в действии, когда оно выполняется. Служба может проверить данные результата, чтобы увидеть, была ли обработана широковещательная рассылка, и если нет, предпринять соответствующие действия.
источник
В дополнение к принятому ответу , если у вас есть несколько экземпляров действия, вы можете использовать вместо этого счетчик:
источник
Ты пробовала..
источник
Нашел легкий обходной путь с помощью следующего кода
источник
Используйте переменную isActivity, чтобы проверить, активна ли активность или нет.
Тогда проверь
источник
Если вы хотите проверить, находится ли активность в заднем стеке, просто выполните следующие шаги. 1. Объявлен ArrayList в вашем классе приложения [Класс приложения определен в вашем файле mainfest в теге приложения]
И добавьте следующие открытые методы для доступа и изменения этого списка.
В BaseActivity, где все действия расширяют его, переопределите методы onCreate и onDestroy, чтобы вы могли добавлять и удалять действия из заднего стека следующим образом.
Наконец, если вы хотите проверить, находится ли действие в заднем стеке или нет, просто вызовите эту функцию isActivityInBackStack.
Пример: я хочу проверить, находится ли HomeActivity в заднем стеке или нет:
источник
источник
Эта работа, если у вас нет той же активности на переднем плане. Если вы открываете из уведомлений не работает, я сделал некоторые изменения и пришел с этим:
Это работает для меня с несколькими действиями, открытыми одновременно.
источник