2017-01-24 2 views
5

У меня есть приложение для Android, в котором клиент чата является одной из его функций. Клиент чата использует XMPP на основе библиотеки Smack для Android и работает Openfire как сервер XMPP в фоновом режиме. Соединение установлено с помощью BOSH. Вся обработка соединения XMPP реализована как служба для запуска и прослушивания в фоновом режиме для входящих сообщений, даже если на первом плане активность приложения отсутствует. Пока все работает отлично.Android/Smack: поддерживайте соединение XMPP в спящем режиме

Единственная проблема, похоже, в спящем режиме. В эмуляторе (когда установлено значение «Stay Awake») или с использованием телефона, соединения XMPP удерживаются, и приложение может отправлять и получать сообщения. Однако, как только телефон переходит в спящий режим, соединение XMPP ломается - я вижу его в консоли администратора сервера Openfire, что пользователь находится в автономном режиме. Интуитивно я хочу получать сообщения все время, например, WhatsApp.

Конечно, я искал в Интернете, включая Stackoverflow, но я не смог получить окончательный ответ. Часто прецедентом является то, что задача должна выполняться периодически, скажем, один раз в час. Но это не похоже на fir в случае клиента чата. Так как я предполагаю, что это общий случай использования - в конце концов, есть так много чат приложений или приложений с чатом особенности там - это мой вопрос:

  • Как я должен изменить/продлить приложение, которое я могу получить сообщение чата во время сна?

  • Я наткнулся на WakeLock. Это способ пойти или они не подходят для моего использования?

  • С Lollipop существует также JobScheduler API, который сам использует WakeLock. Лучше?

  • Как, например, WhatsApp обрабатывает этот случай?

На стороне примечания: У меня проблемы с режимом ожидания, используя эмулятор для отладки. Когда я выключаю «Stay Awake» в эмуляторе, экран становится черным через 1+ мин, а соединение XMPP прерывается. Но я как-то понятия не имею, как проснуться/переключить эмулятор обратно, как только он потемнеет. Android Studio на самом деле говорит мне в какой-то момент, что устройство или что-то ушло, и я снова должен перезапустить эмулятор.

ответ

2

Точный способ решения этой проблемы - использовать push-уведомление.

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

Что касается случая WhatsApp, он также использует тот же XMPP и поддерживает сервер, который действует как класс-оболочка при обмене сообщениями. Этот сервер проверяет состояние сообщения, доставлено ли оно или нет. Если он не доставлен, он отправляет push-уведомление, которое теперь находится на конце устройства в службе push при получении сообщения, оно проверяет, является ли соединение активным и аутентифицировано или нет.

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

Надеется, что это помогает :)

+0

Вам не нужны push-уведомления, и «естественное поведение соединения XMPP не отключается после указанного промежутка времени ожидания». – Flow

2

Вам не нужно нажать уведомления, вам не нужно WakeLock с.Вместо того, чтобы просто

  • Whitelist приложение из спящего режима
  • Используйте липкий (START_STICKY) фоновая служба ServerPingWithAlarmManager
  • Закон
  • Используйте Хлопал на CONNECTIVY_CHANGED намерения отправить по Android и использовать XMPPTCPConnection «s instantShutdown() в том, что дело.
+0

Как это влияет на срок службы батареи. Если я правильно понимаю, для «белых» приложений из режима «доза» требуется ОК от пользователя мобильного телефона. – Christian

+0

Влияние на срок службы батареи зависит от того, сколько XMPP Stanzas проходит по проводу. Таким образом, вы должны избегать ненужного трафика. – Flow

+0

@ Поймайте, какова цель последней темы? благодаря – joao2fast4u

Смежные вопросы