2015-09-14 5 views
0

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

+0

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

ответ

3

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

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

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

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

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

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

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

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

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

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

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