Связь с активностью из службы (LocalService) - Android Best Practices - PullRequest
20 голосов
/ 05 февраля 2011

Обычный сценарий - действие с фоновой службой для опроса сервера.

Служба будет периодически запускаться через AlarmManager, а также выполнять задачи для действия (пользователь нажимает кнопку, идет, что-то получает с сервера).*

Я бы хотел узнать лучшие практики здесь.Я думаю, что лучшим дизайном будет пример Android LocalService: http://developer.android.com/reference/android/app/Service.html#LocalServiceSample

Однако в этом примере Activity имеет ссылку на действие mBoundService, но обратного соединения нет ( Служба не имеетспособ вызова Activity ).

Каков наилучший способ для Сервиса вызвать Activity?

Использую ли я Intents, BroadcastReceivers, Messages?Как?

Ответы [ 3 ]

9 голосов
/ 05 февраля 2011

Я думаю, что лучшим дизайном будет пример Android LocalService: http://developer.android.com/reference/android/app/Service.html#LocalServiceSample

Я бы не стал.Используйте самое легкое соединение, которое вы можете выдержать.Следовательно, в среднем стремитесь к шаблону команды с startService() вместо шаблона привязки с bindService().В частности, привязка представляет собой небольшую боль, когда речь идет об изменениях конфигурации (например, поворотах экрана).

Каков наилучший способ для Сервиса вызвать действие?Я использую Intents, BroadcastReceivers, Сообщения?Как?

См. Уведомить деятельность из службы

1 голос
/ 05 февраля 2011

Если вам нужна тесная связь между вашими действиями с помощью bindService (), то, как вы будете общаться, зависит от того, кто является источником сообщения.

Если служба создается (например, сигнал тревоги, в котором есть какая-то новая информация для обмена), она обычно отправляет широковещательную рассылку.

Если действие инициируется (скажем, в вашем примере «пойти получить что-то с сервера»), оно может обрабатываться асинхронно с использованием AsyncTask или аналогичного. То есть вы можете извлечь данные с сервера в AsyncTask.doInBackground () и опубликовать результаты обратно в действие в AsyncTask.onPostExecute. Этот сценарий будет немного сложнее, если ожидается, что запрошенная операция займет очень много времени - в этом случае я бы отключил ее и вместо этого отправил бы широковещательную рассылку из службы.

0 голосов
/ 29 июля 2018

Как написано здесь

Когда вы хотите связаться от сервиса с деятельностью или фрагментом, который НЕ запустил сервис, или для связи с сервисом с несколькими действиями / фрагментами, тогдавы можете использовать шину событий или широковещательную рассылку, поскольку они могут получать обратный вызов для события в любом действии или фрагменте, где бы они ни реализовывались. Если вы хотите связаться от службы к действию / фрагменту, который запустил службу, вы можете использовать Pending Intent или Messenger.так как они могут быть помещены в дополнительный Intent и переданы в Service.

Pending Intent

Мы можем использовать createPendingResult (), который создает новый объект PendingIntent, который вы можете передатьчтобы использовать и отправлять данные результатов обратно в вашу деятельность с помощью обратного вызова onActivityResult (int, int, Intent).

Шина событий

Вы можете повысить сервиссобытия, действия или фрагменты которых можно прослушивать и отвечать на них с помощью Event Bus.

Messenger

Messenger является подлежащим продаже и, следовательно, может быть помещен в дополнительный объект Intent, так что ваша деятельность может передать этот Messenger службе. Служба будет заполнять объект Message любыми данными, необходимыми длябыть отправленным.

Интервалы вещания

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

...