Шаблон проектирования альтернативных действий, если приложение находится на переднем плане?

StackOverflow https://stackoverflow.com//questions/22001844

  •  20-12-2019
  •  | 
  •  

Вопрос

Я создаю действие, которое использует Google Cloud Messaging для получения push-уведомлений.

Это включает в себя пару примечательных компонентов, а именно:

  • А WakefulBroadcastReceiver чтобы получить сообщение от GCM.
  • Ан IntentService получать уведомления при получении события GCM.

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

Я хотел бы опубликовать уведомление в ящике уведомлений, если приложение не активно, и просто переслать событие на передний план, если приложение активно.

Есть ли для этого шаблон проектирования?Как мне определить, находится ли приложение на переднем плане или на переднем плане?фон?

Это было полезно?

Решение

Вы можете следовать подходу, описанному в этот пост в блоге где вы создаете BroadcastReceiver в вашей Activity с положительным приоритетом (т. е. выше, чем значение по умолчанию 0), который перехватывает определенное действие, а затем вызывает abortBroadcast - это обрабатывает случай открытия приложения.Затем вы также регистрируете BroadcastReceiver в вашем манифесте, который обрабатывает то же действие, но с приоритетом по умолчанию — это запасной вариант, если приложение не открыто и создает системное уведомление.

Затем вы используете sendOrderedBroadcast() чтобы отправить вашу трансляцию всем зарегистрированным получателям в приоритетном порядке.Если активность открыта, ее обработает первая.В противном случае по умолчанию будет выбран другой и будет создано уведомление.

Другие советы

Я предлагаю сделать это следующим образом.

Иметь всю логику, касающуюся GCM в Сервисе (я никогда не использовал IntentService, так что я не знаю, насколько это смело, но я вижу, что он наследует от Service).

В вашей активности наверняка есть способ запуска сервиса (возможно, пользователь активирует через кнопку), здесь ничего нового.

А вот и самое интересное.В своей деятельности вы справляетесь onPause() и onResume()onResume() ты связывать на службу.С помощью механизма привязки вы можете получить указатель на свой сервис и сообщить ему, что вы там "эй, сервис, я активен и я здесь...пожалуйста, сохраните указатель на себя где-нибудь", и служба сохраняет указатель на активность (назовем ее mActivity).В вашей onPause() вы уведомляете службу, что уходите, поэтому служба устанавливает mActivity = null, а потом ты развязать из службы.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top