Как определить, является ли какая-либо из моих действий наиболее заметной и видимой для пользователя? - PullRequest
25 голосов
/ 29 июня 2010

Я хотел бы запустить намерение, когда какая-либо из моих действий видна, в противном случае я выставлю его как уведомление, и пользователь будет запущен.

Чтобы решить это, мне нужно знать, является ли какое-либо из моих занятий самым передовым, как мне это сделать?

Ответы [ 5 ]

10 голосов
/ 29 июня 2010

Я не знаю, что есть способ получить текущую отображаемую активность, но вы могли бы сделать что-то, комбинируя Жизненный цикл активности и флаг.

Для флага, если выкласс Application расширен, это, вероятно, достойное место для его хранения.Для расширения класса приложения в топ-ответе на этот вопрос есть информация.(d).

Поэтому, вероятно, отслеживайте текущую активную активность (или флаг, который видна активность) в onResume / onPause или onStart / onStop в зависимости от того, какое именно поведение вы хотите.

Поскольку у вас есть несколько действий, вам понадобится место для центроида для хранения флага, поэтому приложение имеет смысл.Вы можете получить пользовательский объект Application, приведя контекст приложения (например, ((MyApplication) getApplicationContext ()). IsMyActivityActive).

Вы также можете расширить Activity, чтобы поддерживать этот код в чистоте и содержании.


Если вы используете сервис, вы можете связываться с сервисом в каждом действии в onStart / onStop (или onResume / onPause).Если вы связаны, вы видны.

4 голосов
/ 12 марта 2012

Вы можете запросить запущенные задачи из ActivityManager:

ActivityManager activityManager = (ActivityManager)getContext()
                .getSystemService(Context.ACTIVITY_SERVICE);
List<RunningTaskInfo> runningTasks = activityManager.getRunningTasks(Integer.MAX_VALUE));

Из документов API:

Возвращать список задач, которые в данный момент выполняются, с самыми последнимибыть первым и старшим по порядку.

Таким образом, первый элемент в списке является самым активным.

2 голосов
/ 07 марта 2011

Вы можете использовать onWindowFocusChanged (boolean hasFocus) поместить это в суперкласс ваших действий, чтобы запустить намерение, если оно имеет фокус.

2 голосов
/ 29 июня 2010

onResume() вызываемый && onPause() не вызванный = видимый.
У вас есть public static Activity currentlyVisible; в вашем подклассе Application, который будет обновляться вашими действиями (установите для экземпляра в onResume() и nullизд. onPause()).Или придумайте менее уродливый вариант реестра.

0 голосов
/ 07 августа 2015

Вместо использования диспетчера активности есть простой трюк, который вы можете сделать с помощью кода.Если вы внимательно наблюдаете за циклом активности, поток между двумя действиями и передним планом на задний план выглядит следующим образом.Предположим, что A и B являются двумя действиями.

Когда переход от A к B: 1. onPause () для A вызывается 2. onResume () для B вызывается 3. onStop () для A вызывается, когда Bполностью возобновляется

Когда приложение переходит в фоновый режим: 1. onPause () для A вызывается 2. onStop () для A вызывается

Вы можете обнаружить фоновое событие, просто поставив флагв действии.

Создайте абстрактное действие и расширьте его от других ваших действий, чтобы вам не пришлось копировать и вставлять код для всех других действий, где бы вам ни понадобилось фоновое событие.

В абстрактном действиисоздать флаг isAppInBackground.

В методе onCreate (): isAppInBackground = false;

В методе onPause (): isAppInBackground = false;

В методе onStop (): isAppInBackground =true;

Вам просто нужно проверить свой onResume (), если isAppInBackground имеет значение true.n после того, как вы проверите свой флаг, затем снова установите isAppInBackground = false

Для перехода между двумя действиями, поскольку onSTop () первого всегда будет вызываться после возобновления второго действия, флаг никогда не будет истинным, а когда приложение находится в фоновом режиме, onStop() активности будет вызываться сразу после onPause и, следовательно, флаг будет иметь значение true, когда вы позже откроете приложение.

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