вызывается ли метод Activities onPause по истечении времени ожидания экрана?

#java #android #service #screen #onpause

#java #Android #Обслуживание #экран #onpause

Вопрос:

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

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

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

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

С уважением

Комментарии:

1. каков ваш код? у меня возникли некоторые трудности с пониманием вашего вопроса.

2. После дополнительных исследований я обнаружил, что телефон, похоже, полностью переходит в спящий режим, когда время ожидания экрана истекает. При просмотре в logcat есть одноминутные блоки, в которых вообще не создаются журналы (как мои собственные, так и системные). Есть ли какой-либо способ заставить службу иметь высокий приоритет? Я пытался использовать startForeground() в своем сервисе, но поведение такое же.

Ответ №1:

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

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

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

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

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

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

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

Комментарии:

1. Даже мой сценарий чем-то похож на этот. Представление отображается с помощью Windowmanager через сервис. У меня есть асинхронная задача, которая запускается, если выполняется длительная задача, и если промежуточный экран выключен и включен немедленно, и эта задача все еще не завершена, тогда появляется панель запуска, а под ней появляется экран блокировки. Журналы показывают, что onPause of launcher запускается после отображения keyguard. Нужна помощь в этом 🙂

2. Как мне сделать так, чтобы keyguard находился поверх панели запуска?