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% в час:(И я считаю, что нет проблемы в том, что приложение должно заставить эти веб-сервисы запрашивать все их запросы, кроме той функции, которая заставляет этот телефон быть живым.
Итак, мой вопрос, есть ли какое-то другое решение, которое я могу использовать, потому что у меня есть какое-то приложение на телефоне, которое работает в backgorund, но они совсем не разряжают батарею (avast, защитник сока и т. Д.).
Любая идея очень полезна!
С уважением!
5 ответов
Вы должны освободить WakeLock как можно скорее. Не используйте их. Вместо этого попробуйте широковещательный приемник и AlarmManger, чтобы сделать то, что вы хотите.
Менеджер сигналов тревоги и Broadcst приемник ваши друзья. И вы можете также подумать о том, насколько важны изменения в строке состояния, если телефон лежит глубоко в заднице. Это настолько важно, что это должно произойти даже в этом случае?
Как насчет использования механизма push, такого как C2DM для Android, вместо того, чтобы все время опрашивать.
Google I_O 2009 - Кодирование для жизни - срок службы батареи, то есть
http://www.youtube.com/watch?v=OUemfrKe65c
это ответит на ваш вопрос.
Вы можете настроить AlarmManager с флагом RTC на каждые 5 минут для запуска Сервиса (возможно, IntentService лучше) внутри Service Acquire wakelock при выполнении сетевых операций и остановке сервиса, как только вы это сделаете.