Соединительные разъемы и опрос. Что является лучшим решением с точки зрения срока службы батареи?

Итак … Я делаю приложение для Android. Приложение должно отправлять и получать данные чата реального времени (должен быть сокетом), но ему также необходимо отправлять команды (которые не так, как клиент знает, когда он что-то посылает).

Мне нужно знать, что является лучшим решением с точки зрения экономии аккумулятора пользователя.

A) Открытие и закрытие соединения при каждом отправке команды, если вкладка чата открыта, а затем поддерживать постоянное соединение.

B) Постоянно держите соединение постоянным.

Я посмотрел вокруг Интернета, но получил смешанные ответы, некоторые говорят, что поддерживать постоянное соединение плохо для батареи, а другие говорят, что это не так. (Пример: «Вы спрашиваете, будет ли при открытии TCP-соединения слить аккумулятор? -life? Может быть, я ПУТЬ здесь, но, поддерживая открытую связь, не следует терять время автономной работы … Если вы думаете, что мне будет интересно узнать, где вы получили эту информацию, это звучит так странно для меня ». )

Или, если будет другое решение, которое было бы лучше. Я не думаю, что C2DM Google был бы очень полезен и в этой ситуации.

В основном, что больше разряжает батарею: имеет постоянное соединение или открывает и закрывает соединение, если вкладка чата не открыта?

Благодаря!

Сохранение незанятого соединения сокетов TCP (без отправки или получения данных) не будет (или, по крайней мере, не должно) потреблять больше батареи, чем закрывать ее. Это связано с тем, что простоя TCP-соединения не использует полосы пропускания или циклы CPU (*).

Тем не менее, сохранение TCP-соединения в течение длительного времени может быть хорошим вариантом для мобильного устройства, поскольку соединения TCP плохо взаимодействуют с компьютерами, которые переходят в спящий режим. Сценарий проблемы будет следующим: ваш пользователь Android заставляет его Android-устройство спать во время работы вашего приложения, а затем программа удаленного пользователя (или что-то еще на другом конце TCP-соединения) отправляет некоторые данные по потоку TCP. Программа удаленного пользователя никогда не получает ACK обратно с устройства Android, потому что, конечно, устройство Android спит, поэтому TCP-стек удаленного устройства предполагает, что пакеты TCP-пакетов, которые он отправил, должны быть потеряны, и он реагирует, увеличивая период ожидания, Уменьшая размер его TCP-окна (например, количество TCP-пакетов, разрешенных в полете в один раз) и повторно отправляя пакеты TCP. Но устройство Android все еще спит, и, таким образом, одно и то же происходит снова. Результат заключается в том, что через несколько минут удаленный конец TCP-соединения замедлился до такой степени, что даже если Android-устройство должно было проснуться, TCP-соединение, вероятно, будет слишком медленным, чтобы его можно было использовать, – в этот момент ваш Программа должна будет закрыть подключенное TCP-соединение и запустить новую в любом случае, так зачем беспокоиться о том, чтобы ее открыть?

Поэтому моя рекомендация состояла бы в том, чтобы пойти с опцией (а), с условием, что вы закрываете TCP-соединение как часть вашей процедуры «устройство-идущий-спать-сейчас».

Одно из возможных предостережений заключалось бы в том, что если у Android есть функция, в которой сохранение открытого TCP-соединения приводит к тому, что оборудование WiFi или сотовой сети остается включенным в ситуации, когда в противном случае его можно было бы спать – если это так, то Android Устройство будет платить за батарею за питание антенны, что в противном случае ей не пришлось бы платить. Я не знаю ни одной подобной логики Android, но я только немного использовал Android, так что это может быть просто невежество с моей стороны. По крайней мере, это может стоить проверить.

(*) Ну, технически TCP действительно отправляет пакет «keepalive» так часто, пока TCP-соединение открыто, и оно использует некоторые циклы процессора и мощность антенны … но интервал по умолчанию для отправки пакетов keepalive на Android составляет два часа , Поэтому я сомневаюсь, что сила, используемая для этого, будет заметна.

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

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

Батарея очень сильно связана с переходом состояния радиостанции в 3G от DCH / FACH / IDLE. Если вы хотите, чтобы приложение было энергосберегающим, вы должны отправлять как можно больше данных на ограниченный промежуток времени, не имеющий отношения к постоянному соединению, или нет …

Intereting Posts
Чтение всех файлов в файловой системе Android Совет по партнерским программам для музыки для Android-приложений Контекст приложения SharedPreferences и контекст активности Instant Run выполнил полную сборку и установку, поскольку установка на устройстве не соответствует локальной сборке на диске Почему мой тост не появляется? Фрагменты startActivityForResult всегда возвращают resultCode 0 и намерение null при обратном вызове onActivityResult Начать MAIN-активность текущего приложения, не зная его имени Android – AttributeSet Ошибка в файле pom в проекте Maven после импорта в Eclipse Изменить заголовок ActionBar с помощью фрагментов Какое событие увольняется после того, как все взгляды полностью вычеркнуты? Включая приложение QR-сканера с PhoneGap Идентификатор ресурса не найден для приложения: layout_scrollflags из CollapsingToolbarLayout API Google Maps API v2 – разрешение «ACCESS_FINE_LOCATION», требуемое при включенном слое с моим местоположением «SQLiteDiskIOException: код ошибки 10: ошибка ввода-вывода диска» повторяет работу на ICS и Samsung Nexus на DROP TABLE