Как определить, является ли какая-либо из моих операций самой фронтальной и видимой для пользователя?

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

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

Ответ 1

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

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

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

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

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


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

Ответ 2

Вы можете запросить выполняемые задачи из ActivityManager:

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

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

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

Итак, первый элемент в списке - это самый передний вид активности.

Ответ 3

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

Ответ 4

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

Ответ 5

Вместо использования Менеджера активности есть простой трюк, который вы можете сделать с помощью кода. Если вы внимательно наблюдаете за циклом активности, поток между двумя действиями и передним фоном выглядит следующим образом. Предположим, что 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 - это правда. n после того, как вы проверите свой флаг, затем снова установите isAppInBackground = false

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