вызывается метод Activity onPause по истечении времени ожидания экрана? - PullRequest
2 голосов
/ 17 октября 2011

У меня проблемы с пониманием функции тайм-аута экрана и как это повлияет на выполнение кода в моей деятельности. Вызывается ли onPause () при превышении времени ожидания на экране?

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

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

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

Привет

1 Ответ

2 голосов
/ 18 октября 2011

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

У меня был Activity, который начинал Service.Service (который включал AsyncTask) должен был работать в фоновом режиме, следя за акселерометром и отсчитывая таймер.Затем Service периодически отправлял широковещательную рассылку Intent на Activity, когда в широковещательной рассылке содержались определенные данные, Activity требовалось выполнить некоторый код.Все это должно было произойти с выключенным экраном.

Мои выводы заключаются в том, что, да, при нажатии блокировки экрана Activity действительно запускает onPause(), но все еще полностью в состоянии выполнить код во внутреннемBroadcastReciever класс, и, следовательно, это может вызвать методы в основной процесс деятельности.Я думаю, что это плохой способ сделать что-то, но это сработало.

Проблема была в AsyncTask и Service.Независимо от того, как он настроен (startForegrond() и т. Д.), Фоновый поток будет приостановлен на некоторое время, когда процессор выключится (либо нажатием клавиши блокировки, либо ожиданием тайм-аута экрана).Я обнаружил, что он был приостановлен с интервалами около 1 минуты.

Ответ - использовать PowerManager.WakeLock и установить флаг на PARTIAL_WAKE_LOCK.Это позволит экрану закрыться, но фоновые потоки будут работать на полной скорости в фоновом режиме.

Док. Здесь: http://developer.android.com/reference/android/os/PowerManager.html

не забудьте отпустить его, когда закончите как естьдорого на аккумуляторе.

...