2016-02-07 2 views
1

У меня есть служба и Activity (оба работают как часть одного процесса). В соответствии с ответом SO, https://stackoverflow.com/a/29101448/1215996. Он предлагает передать ссылку Activity на номер Service, чтобы служба могла вызывать обратные вызовы на объекте Activity.Связь между сервисом и деятельностью

1) Разве это хорошая идея сообщить об этом. Не будет ли это плохо, так как это утечка ссылки на деятельность, которая будет избегать GC до Service имеет свою ссылку.

2) Я также проверил, что Messenger может использоваться для связи и связи связи ч/б Активность и обслуживание. AFAIK, это предназначено для использования, если Activity и Service работает в разных процессах. Использование этого механизма не будет накладными расходами на связь b/w Activity и Service, когда они выполняются как часть одного и того же процесса?

Каков наилучший способ общения? Моя основная цель - предоставить некоторое сообщение от Сервиса для Activity, когда какое-то событие происходит в сервисе.

+1

Если у вас есть локальная служба, используйте шаблон «local bound service» (тот же шаблон, который используется в SO ответили на ваш вопрос) – pskink

+0

Я вызываю метод bindService() для привязки к службе, и я могу вызвать методы класса обслуживания , Однако проблема заключается в обратном обмене, вот о чем мой вопрос. Я хочу, чтобы служба уведомляла фрагмент/действие для определенных событий. –

+0

В чем проблема с обратной связью? просто используйте 'register()'/'unregister()' методы либо с помощью простого «списка» клиентов, либо с помощью 'android.os.RemoteCallbackList' – pskink

ответ

5

Никогда не передавайте ссылку на деятельность, чтобы жить дольше, чем активность. Когда-либо. Не просачивайте ссылки на действия.

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

Деятельность обычно связывается с «начатой ​​службой», отправив ей намерение с startService. Обычно это предпочтительнее, чем «связанная служба», потому что это меньше кода и более простой. Запуск службы таким образом в основном упаковывает некоторые данные для Сервиса для самостоятельной работы. Вы можете думать о startService, говоря: «Эй, сервис, сделайте эту работу для меня». И поскольку намерение не может содержать «утечки» ссылок на объекты, это безопасно в этом отношении.

Для сервиса для общения вернуться к деятельности:

LocalBroadcastManager

Это работает как регулярный Android механизма вещания, за исключением того, что вещает никогда не оставляйте заявки (так что они не могут быть перехвачены Другие приложения).

Event Bus

Google не предоставляет официальный автобус события, но там много там, чтобы выбрать из, если вы просто искать «Android event bus». Они предоставляют функции, которые упрощают их использование, чем LocalBroadcastManager, а также позволяют определять состояние различных широковещательных передач данных, которые вы определяете. Какой из них вы выберете, может зависеть от предоставляемых функций или от стиля выражения, которое вы предпочитаете.

Bound Service

Это похоже на Messenger, но устанавливает формальное «связь» между клиентом и службой. Вы можете использовать его для выполнения вызовов стиля RPC между одинаковыми или разными процессами (с помощью Messenger). Имейте в виду, что каждый раз, когда активность приходит и уходит (как изменение ориентации), она должна отвязать и переподтвердить службу. Это прерывание может быть не очень полезно для вашей логики активности.

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

+0

Передача справки о действии/фрагменте во время onCreate() и отмена регистрации в течение onDestroy(). Я считаю, что это может быть безопасно. –

+0

Если вы абсолютно уверены, что другой компонент не будет содержать ссылки на пройденную деятельность за пределами его onDestroy, все должно быть в порядке. –

+0

@SumitTrehan Если вы нашли этот ответ полезным, пожалуйста, примите его как правильный ответ. –

Смежные вопросы