2013-05-20 5 views
0

Может ли кто-нибудь описать или указать мне хорошее описание на «как работает wakelock в андроиде»? Вы можете забыть о стандартной документации для Android.Как работает Wake-Lock в целом? Для меня это не работает

У меня есть сервис (запущен как передний план), и в сервисе будет запущен собственный поток. Поток остается в цикле, пока пользователь не остановит службу. В цикле поток выполняет HTTP-запрос. Из ответа поток знает, после какой задержки (1 минута или больше) должен выполняться следующий HTTP-запрос.

Когда дисплей включен, HTTP-запросы доходят до сервера в ожидаемое время. Но когда дисплей выключен, задержка является случайной. Например. в случае 1 минуты на самом деле его 2:21, 4:04, 4:40, ... Но, я хочу точное время также в случае отображения (предполагается, что он называется режимом глубокого сна).

Итак, я представил wakelock.acquire() и wakelock.release после HTTP-запроса, но это ничего не меняет.

Но это дает мне только общие вопросы:

Как, черт возьми, будет мой код просыпаются, чтобы сделать в wakelock.acquire() когда телефон SLEEPS? Если я дойду до wakelock.acquire(), тогда мне это не понадобится, или ...?

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

Из журналов logcat я вижу, что wakelock.acquire() не вызывается вовремя. Так в чем его использование? Я не могу выполнить wakelock.acquire() при запуске службы или ее потока, потому что это будет означать, что мой сервис будет препятствовать тому, чтобы телефон спал, даже когда я просто хочу сделать HTTP-запрос в 30-минутный период времени.

Я скорее не могу поверить, что с помощью wakelock.acquire() вы можете сделать сервис на всю жизнь, не позволяя телефону глубоко спать.

+0

Эй, может быть, я совершенно неправ, и с wakelocks я могу только помешать телефону глубоко спать, но я не могу разбудить телефон от глубокого сна. Но разве это не нормальный случай, что вам нужно немного разбудить телефон, чтобы что-то сделать ??? И другой вопрос: почему HTTP-запрос выполняется вообще в глубоком сне. Получает ли мое обслуживание некоторое время обработки, потому что какое-то другое приложение пробуждает телефон? Но как это приложение делает это. Я хочу, чтобы он делал то же самое. – valerian

ответ

0

В целом, блокировки только поддерживают только экран или процессор. Они не разбудят телефон, когда он уже спит. Вы можете передать ACQUIRE_CAUSES_WAKEUP при создании блокировки слежения, чтобы изменить это поведение, но оно все равно не будет делать то, что вы хотите, из-за поведения Android во время глубокого сна. По сути, ваш звонок в Wakelock.acquire() всегда будет слишком поздно, из-за поведения Android в спящем режиме - он запускает ваш код только тогда, когда ему кажется, что он спит.

Поскольку вы хотите, чтобы обновления происходили в очень конкретное время, когда вы находитесь в фоновом режиме, похоже, что вы должны использовать AlarmManager.set вместе с одним из флажков ELAPSED_REALTIME_WAKEUP или RTC_WAKEUP. Используйте setInexactRepeating(), если можете, см. http://www.google.com/events/io/2009/sessions/CodingLifeBatteryLife.html по причинам, почему (срок службы батареи).