Держите приложение в фоновом режиме в ответ на намерение - PullRequest
0 голосов
/ 25 мая 2011

Мое приложение Android имеет тайм-аут неактивности. По истечении времени я возвращаю пользователя к экрану «Вход», который (всегда) находится в заднем стеке. Мой класс SignIn имеет android:launchMode="singleTop", поэтому экземпляр, работающий в backstack, всегда используется повторно.

Я запускаю это намерение по таймауту:

Intent inactivityTimeout = new Intent(this, SignIn.class);
inactivityTimeout.putExtra(INTENT_EXTRA_INACTIVITY_TIMEOUT, true);
int flags = inactivityTimeout.getFlags();
flags = flags|FLAG_FROM_BACKGROUND|Intent.FLAG_ACTIVITY_CLEAR_TOP;
inactivityTimeout.setFlags(flags);

Когда запускается экран входа в систему, он проверяет наличие INTENT_EXTRA_INACTIVITY_TIMEOUT Intent extra. Если он найден, отображается диалоговое окно «Вы вышли из системы». Это все работает правильно.

Теперь я перейду к проблеме: поскольку она основана на таймере, это намерение может быть запущено независимо от того, находится ли мое приложение на переднем плане или в фоне. Это желательно, поскольку я не хотел бы, чтобы приложение оставалось в системе в течение неопределенного времени только потому, что оно находится в фоновом режиме.

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

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

Может кто-нибудь предложить способ реализовать это в моем намерении (или в ответном задании?). Или я что-то здесь упускаю? Спасибо!

Ответы [ 2 ]

5 голосов
/ 25 мая 2011

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

Каждое действие должно проверять, есть ли у пользователя действительные учетные данные.В этой проверке вы также проверяете возраст и просто не проходите проверку учетных данных, если учетные данные правильные, но слишком старые.И при неудачной проверке учетных данных вы активируете свою регистрационную активность.

Это позволяет сбросить таймер.

2 голосов
/ 25 мая 2011

Вы можете иметь глобальную статическую переменную, чтобы проверить, находится ли приложение на переднем плане:

public static boolean isForeground = false;

Для каждого действия onPause установите переменную false Для каждого действия onResume установите переменную true

Таким образом, вы узнаете, находится приложение на переднем плане или нет.

Когда тайм-аут достигнут, если активность находится на переднем плане, активируйте намерение. Если это не так, задайте для глобальной статической переменной значение true. Эта переменная будет проверяться для каждого onResume, и если она имеет значение true, она запускает намерение тайм-аута (таким образом, оно будет запущено при возобновлении работы приложения).

public static boolean hasTimeout = false;

Это будет проще, если у вас есть BaseActivity, где вы реализуете это, которое расширяется всеми другими действиями.

...