Android - отслеживайте невидимые уведомления и лучшие практики
В Android у меня есть сокет, поддерживающий связь с сервером в режиме реального времени. Этот сокет приложения управляется службой, которая запускается при загрузке и / или всякий раз, когда приложение отправляет запрос.
Поскольку я не могу зависеть от Google PlayStore, я полностью контролирую отправку + получение push-сообщений вручную.
Всякий раз, когда новое push-сообщение поступает с сервера, сервис сокетов отправляет локальное широковещательное сообщение, и действия по прослушиванию могут следовать за его собственным действием. Если никаких действий не найдено, пользователю по умолчанию выдается уведомление Android с надписью "[ap] У вас {n} новое сообщение (я)'...
Это имеет свои проблемы со стабильностью (служба может быть закрыта ОС, например, при нехватке памяти), но это нормально.
Теперь рассмотрим следующее:
У меня есть несколько действий, которые прослушивают и показывает количество непрочитанных сообщений.
- HomePage
- ConversationsOverviewPage
- Страница беседы "The" (страница чата)
Каждое действие может быть на переднем плане, но также может находиться в памяти, когда пользователь нажимает назад и возвращается на 1 действие. Таким образом, в теории может возникнуть ситуация, когда вы хотите обновить разные / множественные действия одновременно. Это предотвращает необходимость "повторной загрузки" непрочитанных сообщений с сервера, когда пользователь возвращается к "saveInstance". Так что шаблон вещания работает лучше всего, я думаю.
Как лучше всего отслеживать глобальные непрочитанные сообщения, минимизируя при этом отключение сервера на каждом экземпляре активности:
- Очень просто: сделайте запрос к серверу для каждого экземпляра действия и снова напишите код обновления для каждого действия. Но это приводит к тому, что пользователь видит задержку, так как приложению требуется секунда, прежде чем приложение получит данные с сервера и отобразит всплывающую подсказку "непрочитанные сообщения".
Simpel: Есть глобальный класс. Содержит непрочитанные сообщения для каждого разговора, но я чувствую, что это может создать проблемы с неполностью данных. Особенно, когда приложение не "активно".
Мой старый голос: есть другая служба, которая отслеживает непрочитанные сообщения, которая запускается при загрузке (как сокет). Только когда служба запускается / загружается, она запрашивает все данные непрочитанных сообщений с сервера. Каждое действие может "запрашивать" данные непрочитанных сообщений и больше не беспокоиться об этом. Но это может быть излишним?
Мой новый голос: оставьте сервис сокетов и добавьте отдельный класс к этому сервису. Он содержит непрочитанные данные. Но это также не кажется правильным. Поскольку действие должно было бы что-то спросить у сервиса Это не относится к сокетам для управления непрочитанными сообщениями (разделение задач), верно?
Большое спасибо опытным разработчикам!
1 ответ
Третий вариант в порядке. Не уверен где overkill
именно так. Очевидно, что вы не должны загружать все непрочитанные сообщения при каждой загрузке или переподключении сокета. Самое важное правило - загружать данные, когда приложение действительно в этом нуждается. Несколько моментов о том, как я разработал одно и то же приложение:
- есть розетка
Service
который обрабатывает подключение, отключение, отправку данных (сообщений) и получение данных. - есть
Notification manager
который получает события отSocketService
, Он сохраняет новые данные, поступающие с сервера, и решает, какие широковещательные уведомления следует отправлять. - когда сокет подключен, он получает данные о состоянии от сервера:
- даты (отметка времени) последнего обновления для каждого чата. Например, если локальная база данных содержит этот чат
A
вчера был обновлен, но недавно полученные данные с сервера говорят, что чатA
был обновлен несколько секунд назад, вам нужно транслировать событие какchat A has been updated since last connection
и сохранить дату обновления. Если там есть какие-то действия, которые как-то показывают чатA
он загружает (через http или что-то еще) новые данные. last messages
за каждый чат. Приложение просто сравнивает локально сохраненныйlast messages
и только что получил. Если есть новое приложение снова транслирует событие, какthere is unread message/messages from user x
, Если есть видимая активность, которая показывает обновленный чат, он обновляет данные, в противном случае приложение показывает уведомление.
- даты (отметка времени) последнего обновления для каждого чата. Например, если локальная база данных содержит этот чат
Итак, основной поток обработки непрочитанных сообщений следующий: подключиться к серверу >
проверить, есть ли данные о непрочитанных сообщениях >
сохранить новые данные в локальной базе данных >
трансляция событий о новых данных.
И я бы порекомендовал вам использовать GCM
и сокетное соединение одновременно. GCM
действительно помогает обновлять данные. Он пробуждает телефон и иногда доставляет данные, когда не удается установить сокетное соединение из-за проблем с сетью.