Android: приложение, работающее в фоновом режиме, разряжает батарею

Я сделал приложение, которое подключается к моему серверу каждые 5-10 минут и проверяет, есть ли какие-либо изменения в базе данных.

Поэтому я использую Сервис, чтобы приложение могло работать в фоновом режиме, а пользователь мог закрыть приложение и получать сообщения в строке состояния. Внутри него я использую Thread, чтобы приложение спал на 5-10 минут. Проблема начинается, когда я блокирую телефон. чем приложение просто останавливается (это потому, что когда вы блокируете свой телефон, он переходит в «сон»), поэтому я понял, что мне нужно это:

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, 'My Tag');      
wl.acquire();

Это заставляет телефон не спать, кроме экрана. Но там я застрял. Это работает нормально, но сильно разряжает батарею. 10% в час :( И я считаю, что проблема не в том, что приложение должно постоянно запрашивать эти веб-сервисы, а в той функции, которая заставляет этот телефон работать.

Итак, мой вопрос в том, есть ли какое-либо другое решение, которое я могу использовать, потому что у меня есть какое-то приложение на телефоне, которое работает в фоновом режиме, но они совсем не разряжают батарею (avast, защитник сока и т. д.).

Любая идея очень полезна!

С уважением!


person Jure Možina    schedule 05.01.2012    source источник


Ответы (5)


Как насчет использования механизма push, такого как C2DM для Android? опроса все время.

person Fernando Miguélez    schedule 05.01.2012

Google I_O 2009 – Кодирование на всю жизнь – Срок службы батареи, то есть

http://www.youtube.com/watch?v=OUemfrKe65c

это ответит на ваш вопрос.

person Sunny Kumar Aditya    schedule 05.01.2012

Вы должны освободить wakelocks как можно скорее. Не используйте их. Вместо этого попробуйте приемник Broadcast и AlarmManger, чтобы делать то, что вы хотите.

person Yury    schedule 05.01.2012

Менеджер тревог и приемник Broadcst — ваши друзья. А еще можно подумать, насколько важны изменения в строке состояния, если телефон лежит глубоко в заднем кармане брюк. Это импдата настолько важна, что она должна произойти даже в этом случае?

person Konstantin Pribluda    schedule 05.01.2012

Вы можете настроить AlarmManager с флагом RTC на каждые 5 минут для запуска службы (может быть, IntentService лучше), внутри Service Acquire wakelock при выполнении сетевых операций и остановить службу, как только вы закончите.

person nandeesh    schedule 05.01.2012