Получайте onPause & onResume как события на уровне приложения / задачи - PullRequest
9 голосов
/ 07 сентября 2011

Мне было интересно, что может быть причиной отсутствия обратного вызова на уровне приложения, когда приложение переходит в фоновый режим и выходит на передний план. Activity класс * onPause и onResume вызываются только в текущей верхней активности. Если я хочу остановить некоторую фоновую задачу, имеющую область действия уровня приложения, то нет простого способа остановить ее, когда приложение переходит в фоновый режим. Существует высокий спрос на эти обратные вызовы событий.

Почему Android не имеет функции обратного вызова на уровне приложения при приостановке и возобновлении работы приложений? Может ли он быть реализован в Android на уровне задач (стека активности), если не на уровне приложений?

Реальная проблема:

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

В настоящее время я помещаю повторяющийся код в BaseActivity. Это на уровне активности. Задача останавливается и запускается при каждой паузе и возобновлении каждой активности, а событие приложения, переходящего в bg или в fg, скрыто среди одного из этих событий, которое я не могу знать. Я хотел знать, есть ли лучший способ сделать это, я имею в виду, когда приложение перестало быть видимым для пользователя.

Ответы [ 3 ]

4 голосов
/ 17 сентября 2011

Использовать Handler вместо TimerTask. Временное сообщение для обработчика, привязанного к циклу активности, не будет запущено, если действие не активно.

Шаблон будет посылать синхронизированное сообщение обработчику, который, в свою очередь, порождает Thread / AsyncTask, который будет выполнять запрос в фоновом режиме и обновлять пользовательский интерфейс. Немного больше накладных расходов на создание / уничтожение потоков, но это все равно связано с вводом / выводом. Вы можете создать пул потоков, если эти накладные расходы превратятся в труднодоступные места (хотя я сомневаюсь, что это произойдет).

Если вы действительно хотите знать, когда ваше приложение больше не находится на переднем плане, вы можете использовать перекрытие в onStop / onResume между двумя действиями. При переходе из A-> B onResume B будет вызываться перед onStop A. Следовательно, вы можете увеличить глобальный счетчик в onResume и уменьшить его в onStop. Этот счетчик станет 0, если и только если никакие действия не видны. Я успешно использовал это для отслеживания точных посещений в аналитических целях. Тем не менее, он требует общего базового класса для всех ваших действий.

3 голосов
/ 17 сентября 2011

Вы говорите об android.app.Application class? Существует одно приложение, созданное при запуске вашего приложения, до запуска какой-либо операции или службы, и оно живет до тех пор, пока ваше приложение остается в памяти.

Вы можете расширить это Приложение и поместить туда некоторые глобальные данные. Укажите в манифесте в имя вашего расширенного класса.

Теперь вы должны понимать, что Приложение как таковое не выходит на передний план или фон, может только Активность. Однако из вашей Activity вы можете вызвать getApplication, чтобы получить свой единственный экземпляр Application (использовать приведение), и вызвать свои собственные методы, связанные с изменением фокуса, таким образом зная, находится ли ваше приложение в целом на переднем плане или в фоне, и вести себя как нужно.

И у Сервиса также есть метод getApplication (), который получает тот же объект Application.

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

0 голосов
/ 07 сентября 2011

Если вы хотите выполнить некоторую фоновую задачу с областью действия на уровне приложения, вам следует запускать новую ветку в Service , чтобы выполнить эту задачу за вас.

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

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