Intereting Posts
Android – надежное получение текущего местоположения Когда нужно отменить регистрацию BroadcastReceiver? В onPause (), onDestroy () или onStop ()? Диалоговая тематическая деятельность: позитивные и негативные кнопки Эмулятор Genymotion без подключения к Интернету Как использовать InputType = numberDecimal с помощью «телефонной» мягкой клавиатуры? Внедрение ListView в виджет главного экрана Получить все строки из SQLite Как возобновить работу, а не перезапускать при переходе из панели действий Нет статического метода zzUr () в Firebase, когда я пытаюсь использовать Analytics с уведомлениями Разница между чистым, градульным чистым Ошибка GCM – googleCloudMessaging.register Использование анимации в адаптере с шаблоном ViewHolder Com.android.support:customtabs: нет виртуального метода launchUrl Выполнение модульных тестов перед каждой сборкой в ​​Gradle Asus Nexus 7 не распознается инструментами Android dev через adb

Правила подключения к постоянным сокетам Android

Я тестировал специальное решение для push-уведомлений для устройств Android с использованием постоянных сокетов. Я хотел бы поделиться своими выводами и подтвердить результаты.

Простое описание
Приложения запускают службу переднего плана и устанавливают соединение с сервером и поддерживают это соединение посредством агрессивного пинга (интервал @ 10 секунд). Если соединение когда-либо обнаружено как мертвое, приложение продолжает пытаться повторно подключиться на неопределенный срок. Сервер отправляет уведомления через дуплексный канал.

Тест 1:

Pinging is done using a timer at 10 second intervals. Server sends notification every minute. Applications acquires wifi and wake locks. Duration : 8 hours Battery loss : ~14% 

Тест 2:

 Pinging is done using AlarmManager at 10 second intervals. Server sends notification every minute. Application acquires only a wifilock Duration : 8 hours Battery loss : ~7% 

Предположения: входящий сетевой пакет автоматически просыпает процессор, поэтому нет необходимости в блокировке слежения. Использование AlarmManager для ping (вместо таймеров) означает, что нам не нужен wakelock.

Удаление этого wakelock действительно помогло батарее. Удивительно, но агрессивное пинги на любом решении не повлияло на срок службы батареи настолько, насколько я ожидал. (У нас было много других тестов, в том числе тот, где приложение просто держало wifilock и ничего не делало, что вызвало от 4% до 5% потери батареи за тот же период)

Поскольку приложение удалось успешно отправить все запросы ping и получить все входящие сообщения, я считаю, что мои предположения верны. Но я хотел бы получить подтверждение от любых экспертов.

Еще один вопрос: если приложение должно было вместо этого слушать входящие соединения. В этом случае мне нужно будет держать вакелон, правильно? Входящее соединение не пробуждает CPU? Мы не спускаемся по этому маршруту, а просто хотим подтвердить.

Кроме того, пожалуйста, не рекомендуем GCM, это было исключено политикой компании.

Благодарю.

Solutions Collecting From Web of "Правила подключения к постоянным сокетам Android"

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

Дополнительные примечания:

  • В методе OnReceive BroadcastReceiver для сигнала тревоги ping, если вы не вызываете напрямую сокет (порождая новый поток или намерение), вам нужно будет удерживать блокировку до тех пор, пока запрос ping не будет завершен. Android сохраняет блокировку только до тех пор, пока OnReceive не вернется, после чего возможно (но редко), что процессор может спать до завершения пинга.

  • Используйте высокопроизводительный Wifi Lock, если уведомления чувствительны.

  • Еще одна проблема, связанная с устройством, которая повлияла на решение, рассматривается здесь .

Обновить

Выпущена следующая проблема с Android 5.1: проблема с Android

Обновление 2

Нужно кодировать режим Doze для Android 6.0: Режим Doze