Android - отслеживайте невидимые уведомления и лучшие практики

В Android у меня есть сокет, поддерживающий связь с сервером в режиме реального времени. Этот сокет приложения управляется службой, которая запускается при загрузке и / или всякий раз, когда приложение отправляет запрос.

Поскольку я не могу зависеть от Google PlayStore, я полностью контролирую отправку + получение push-сообщений вручную.

Всякий раз, когда новое push-сообщение поступает с сервера, сервис сокетов отправляет локальное широковещательное сообщение, и действия по прослушиванию могут следовать за его собственным действием. Если никаких действий не найдено, пользователю по умолчанию выдается уведомление Android с надписью "[ap] У вас {n} новое сообщение (я)'...

Это имеет свои проблемы со стабильностью (служба может быть закрыта ОС, например, при нехватке памяти), но это нормально.

Теперь рассмотрим следующее:

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

  • HomePage
  • ConversationsOverviewPage
  • Страница беседы "The" (страница чата)

Каждое действие может быть на переднем плане, но также может находиться в памяти, когда пользователь нажимает назад и возвращается на 1 действие. Таким образом, в теории может возникнуть ситуация, когда вы хотите обновить разные / множественные действия одновременно. Это предотвращает необходимость "повторной загрузки" непрочитанных сообщений с сервера, когда пользователь возвращается к "saveInstance". Так что шаблон вещания работает лучше всего, я думаю.

Как лучше всего отслеживать глобальные непрочитанные сообщения, минимизируя при этом отключение сервера на каждом экземпляре активности:

  1. Очень просто: сделайте запрос к серверу для каждого экземпляра действия и снова напишите код обновления для каждого действия. Но это приводит к тому, что пользователь видит задержку, так как приложению требуется секунда, прежде чем приложение получит данные с сервера и отобразит всплывающую подсказку "непрочитанные сообщения".
  2. Simpel: Есть глобальный класс. Содержит непрочитанные сообщения для каждого разговора, но я чувствую, что это может создать проблемы с неполностью данных. Особенно, когда приложение не "активно".

  3. Мой старый голос: есть другая служба, которая отслеживает непрочитанные сообщения, которая запускается при загрузке (как сокет). Только когда служба запускается / загружается, она запрашивает все данные непрочитанных сообщений с сервера. Каждое действие может "запрашивать" данные непрочитанных сообщений и больше не беспокоиться об этом. Но это может быть излишним?

  4. Мой новый голос: оставьте сервис сокетов и добавьте отдельный класс к этому сервису. Он содержит непрочитанные данные. Но это также не кажется правильным. Поскольку действие должно было бы что-то спросить у сервиса Это не относится к сокетам для управления непрочитанными сообщениями (разделение задач), верно?

Большое спасибо опытным разработчикам!

1 ответ

Решение

Третий вариант в порядке. Не уверен где overkill именно так. Очевидно, что вы не должны загружать все непрочитанные сообщения при каждой загрузке или переподключении сокета. Самое важное правило - загружать данные, когда приложение действительно в этом нуждается. Несколько моментов о том, как я разработал одно и то же приложение:

  • есть розетка Service который обрабатывает подключение, отключение, отправку данных (сообщений) и получение данных.
  • есть Notification manager который получает события от SocketService, Он сохраняет новые данные, поступающие с сервера, и решает, какие широковещательные уведомления следует отправлять.
  • когда сокет подключен, он получает данные о состоянии от сервера:
    1. даты (отметка времени) последнего обновления для каждого чата. Например, если локальная база данных содержит этот чат A вчера был обновлен, но недавно полученные данные с сервера говорят, что чат A был обновлен несколько секунд назад, вам нужно транслировать событие как chat A has been updated since last connection и сохранить дату обновления. Если там есть какие-то действия, которые как-то показывают чат A он загружает (через http или что-то еще) новые данные.
    2. last messages за каждый чат. Приложение просто сравнивает локально сохраненный last messages и только что получил. Если есть новое приложение снова транслирует событие, как there is unread message/messages from user x, Если есть видимая активность, которая показывает обновленный чат, он обновляет данные, в противном случае приложение показывает уведомление.

Итак, основной поток обработки непрочитанных сообщений следующий: подключиться к серверу > проверить, есть ли данные о непрочитанных сообщениях > сохранить новые данные в локальной базе данных > трансляция событий о новых данных.

И я бы порекомендовал вам использовать GCM и сокетное соединение одновременно. GCM действительно помогает обновлять данные. Он пробуждает телефон и иногда доставляет данные, когда не удается установить сокетное соединение из-за проблем с сетью.

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