#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 находился поверх панели запуска?