Никогда не передавайте ссылку на деятельность, чтобы жить дольше, чем активность. Когда-либо. Не просачивайте ссылки на действия.
Существует нет «лучшего способа» для обмена данными между Управлением и Сервисом, но есть много вариантов, и вы можете выбрать тот, который лучше всего подходит для вашего случая использования.
Деятельность обычно связывается с «начатой службой», отправив ей намерение с startService. Обычно это предпочтительнее, чем «связанная служба», потому что это меньше кода и более простой. Запуск службы таким образом в основном упаковывает некоторые данные для Сервиса для самостоятельной работы. Вы можете думать о startService, говоря: «Эй, сервис, сделайте эту работу для меня». И поскольку намерение не может содержать «утечки» ссылок на объекты, это безопасно в этом отношении.
Для сервиса для общения вернуться к деятельности:
LocalBroadcastManager
Это работает как регулярный Android механизма вещания, за исключением того, что вещает никогда не оставляйте заявки (так что они не могут быть перехвачены Другие приложения).
Event Bus
Google не предоставляет официальный автобус события, но там много там, чтобы выбрать из, если вы просто искать «Android event bus». Они предоставляют функции, которые упрощают их использование, чем LocalBroadcastManager, а также позволяют определять состояние различных широковещательных передач данных, которые вы определяете. Какой из них вы выберете, может зависеть от предоставляемых функций или от стиля выражения, которое вы предпочитаете.
Bound Service
Это похоже на Messenger, но устанавливает формальное «связь» между клиентом и службой. Вы можете использовать его для выполнения вызовов стиля RPC между одинаковыми или разными процессами (с помощью Messenger). Имейте в виду, что каждый раз, когда активность приходит и уходит (как изменение ориентации), она должна отвязать и переподтвердить службу. Это прерывание может быть не очень полезно для вашей логики активности.
Могут быть другие варианты, но это те, которые наиболее часто используются, о которых я знаю.
Если у вас есть локальная служба, используйте шаблон «local bound service» (тот же шаблон, который используется в SO ответили на ваш вопрос) – pskink
Я вызываю метод bindService() для привязки к службе, и я могу вызвать методы класса обслуживания , Однако проблема заключается в обратном обмене, вот о чем мой вопрос. Я хочу, чтобы служба уведомляла фрагмент/действие для определенных событий. –
В чем проблема с обратной связью? просто используйте 'register()'/'unregister()' методы либо с помощью простого «списка» клиентов, либо с помощью 'android.os.RemoteCallbackList' – pskink