Как отправлять пинг раз в минуту на сервер НАДЕЖНЫМ способом?

В моем приложении для Android мне нужно отправлять сообщение на сервер (в основном, пинг) раз в минуту, когда активируется определенная функция. Функцию можно активировать на 2-3 часа, поэтому важно, чтобы пинг отправлялся непрерывно и своевременно.

Чтобы достичь этого, в настоящее время я использую AsyncTasks (для отправки запроса), запускаемый раз в минуту через службу переднего плана, которая запланирована с помощью alarmManagers setExactAndAllowWhileIdle. У службы переднего плана тоже есть частичный пробуждение!

К сожалению, похоже, что режим дозирования Зефира в конечном итоге глотает сигналы тревоги в некоторой случайной точке. Это происходит КАЖДЫЙ РАЗ и в произвольных точках. Иногда приложение отправляет пинги в течение 2 часов без проблем, иногда только в течение 30 минут, прежде чем они перестают работать (а затем перезапускаются через 10-15 минут).

Что я могу сделать, чтобы пинг отправлялся непрерывно? Это невероятно важно для приложения. Единственная альтернатива, которую я вижу, это то, что я использую GCM, чтобы отправлять высокоприоритетные сообщения каждые 5 минут или около того, чтобы поддерживать его, но я это был бы ужасный взлом.

1 ответ

Попросите пользователя добавить ваше приложение в белый список оптимизации батареи.

Или попросите пользователя использовать эту функцию только при подключении к зарядному устройству или внешнему аккумулятору.

Или попросите пользователя по несколько минут каждые несколько минут трясти свое устройство, чтобы убедить Android в том, что оно не бездействует на тумбочке.

Или создайте свое собственное пользовательское ПЗУ, где вы предпринимаете шаги для изменения Android, чтобы позволить вашему приложению потреблять произвольное количество энергии, а затем попросите пользователей установить ваше пользовательское ПЗУ.

Обратите внимание, что AFAIK ваше решение GCM должно быть каждую минуту, а не каждые пять минут, если вы хотите отправлять "пинг" каждую минуту. Решение GCM не предотвращает переход устройства в режим ожидания; это просто позволяет отправлять сообщения в приложение и иметь краткое окно подключения. Возможно, что окно занимает 5+ минут, но я бы на это не рассчитывал.

Обратите внимание, что в действительности вы говорите, что процессор должен быть включен непрерывно в течение вашего 2-3-часового окна из-за вашего частичного WakeLock, Вы также говорите, что некоторое радио (Wi-Fi или сотовая связь) будет также в режиме высокой мощности в течение большей части этого времени, так как оно проходит через ряд состояний питания с относительно медленным временем перехода и ежеминутным набором пакеты вернут радио обратно в состояние высокой мощности. То, что вы делаете, исключительно плохо для батареи.

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

Другие вопросы по тегам