Отправка данных в связанную службу

У меня есть служба, которая запущена. Кроме того, к службе можно привязать другие компоненты. Когда компонент связывается со службой, у него появляются новые параметры, которые необходимо передать службе. Можно ли заставить onBind вызываться каждый раз, когда вызывающему объекту необходимо выполнить привязку (чтобы доставлять новые данные через намерение)? И если да, значительны ли дополнительные накладные расходы на вызов onBind каждый раз? Кстати, это локальный сервис, в котором я расширяю Binder вместо использования Messenger.


person learner    schedule 14.09.2015    source источник
comment
Если вы привязываетесь к службе, вы можете просто передавать данные в службу через один из ее методов...   -  person tachyonflux    schedule 15.09.2015


Ответы (1)


Несколько моментов для рассмотрения:

1) onBind() вызывается только для первого запроса на привязку. Все последующие вызовы не приводят к вызову onBind. Вот выдержка из документа Google по этому поводу:

К службе могут одновременно подключаться несколько клиентов. Однако система вызывает метод onBind() вашей службы для извлечения IBinder только при первой привязке клиента. Затем система доставляет тот же IBinder всем дополнительным клиентам, которые выполняют привязку, без повторного вызова onBind().

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

2) Используя экземпляр, возвращенный из onBind(), вызывающие могут получить доступ к общедоступным методам службы. У вас может быть один публичный метод, который будет использоваться для отправки любых параметров. Вот документ Google по этому поводу:

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

3) Google рекомендует не использовать дополнительные параметры в параметре намерения bindService. Это может быть связано с пунктом 1), упомянутым выше. Вот выдержка из документа Google:

Намерение, которое использовалось для привязки к этой службе, как указано в Context.bindService. Обратите внимание, что любые дополнения, которые были включены в Intent на тот момент, здесь не будут отображаться.

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

https://stackoverflow.com/a/9955090/4406743

person kmaini    schedule 17.09.2015