Связанная служба Android и запущенная служба для музыкального приложения

Я пытаюсь углубиться в архитектуру сервиса.
Просто для тестирования я создаю музыкальное приложение.
Без сомнения, музыка должна проигрываться в сервисе, но какой тип связи использовать? Насколько я знаю, служба может быть привязана или запущена (или и то, и другое одновременно)

Во-первых, мне нужно воспроизвести/остановить/приостановить/установить источник...
Во-вторых, мне нужно уведомить пользовательский интерфейс, если музыкальный проигрыватель открыт, о таких событиях, как прогресс, буферизация...

Вот мои мысли по этому поводу.
Я думаю о смешении связанного и запущенного сервиса.

Поскольку песню можно установить только из пользовательского интерфейса, а также приостановить/воспроизвести/остановить/искать, я выбираю связь с сервисом из пользовательского интерфейса с помощью биндера. (Связывание службы внутри активности и возврат связующего для связи со службой)

Уведомления, такие как завершение трека, следующий трек, текущая позиция трека, поступающие от службы. Я решил использовать Broadcast receiver для отправки таких уведомлений, потому что это может быть несколько заинтересованных компонентов.

Итак, мой вопрос

  1. Каков наилучший выбор связи (привязанной или широковещательной) для службы музыкального проигрывателя?
  2. Откуда Система знает, что это за услуга? Я имею в виду, что даже если служба bound, мне нужно сначала вызвать метод startService, а затем связать его. Означает ли это, что если был вызван хотя бы один метод bindService, он считается связанной службой и будет уничтожен при вызове метода unbind?
  3. Имеет ли смысл LocalBroadcastManager общаться со службой? Поскольку LocalBroadcastManager является локальным для каждого приложения, почему бы не использовать связанный сервис, чем ? Глобальная трансляция имеет смысл, если другие приложения заинтересованы в событиях.

Помогите пожалуйста разобраться с этим механизмом.


person CROSP    schedule 07.02.2016    source источник
comment
Вы завершили музыкальное приложение? Если да, то как вы управляли музыкой (воспроизведение, пауза, остановка...)? через Службу, Службу намерений или что-то еще? Я в вашей отправной точке ;)   -  person MirlanMaksv    schedule 20.08.2016


Ответы (2)


  1. Лучший выбор связи — использование методов LocalBroadcasts и Binder в соответствии с вашими требованиями. Если вы хотите сделать что-то на службе из вашего связанного компонента, такого как активность, вам следует использовать связыватели. Если вам нужно отправить результат обратно в приложение, вы должны использовать LocalBroadcast.

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

  1. В этом пункте вы ошибаетесь в запуске связанного сервиса. В этом случае вам не нужно вызывать startservice. Требуется только вызов метода bindservice.

    bindService(новое намерение(это, MessengerService.class), mConnection, Context.BIND_AUTO_CREATE);

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

  1. Да, менеджеры LocalBroadcast имеют смысл. Допустим, вы хотите транслировать что-то в своем приложении. Есть 4-5 компонентов, которые вы хотите обновить. Как вы этого добьетесь. Следовательно, использование локальных трансляций является хорошей функцией.

Например, допустим, что есть две службы, запускающиеся из разных действий, и вторая служба начинает свою работу, когда первая служба выполнила свою работу. Таким образом, единственный способ добиться этого — отправить широковещательную рассылку, и вторая служба будет регистрироваться для этой трансляции. Следовательно, он получит его.

person Damanpreet Singh    schedule 07.02.2016
comment
Спасибо за ответ !! Я забыл о том, что вы упомянули в своем ответе. Это общение может быть двунаправленным с использованием связующего (например, фрагмент и действия с использованием приведения к некоторому интерфейсу). Я думаю, что если служба привязки уже используется, было бы проще и чище реализовать это с помощью привязки, только одно, если какой-то другой компонент заинтересован в событиях, было бы лучше использовать LocarBroadcast, я прав? - person CROSP; 07.02.2016

Ага. Услуги довольно трудно понять.

Есть вещи, которые легко. Связанная служба всегда запускается методом bindService. Запущенная служба всегда запускается методом startService. Вам нет необходимости запускать связанную службу или связывать запущенную службу.

Многое из того, что следует ниже, является грубым обобщением...

Запущена служба

Запущенная служба почти бесполезна, если только это не IntentService. IntentServices — довольно хорошие инструменты для запуска асинхронных задач. Вы отправляете им небольшой набор параметров, и они начинают делать то, что указывают эти параметры. Они похожи на методы void в том смысле, что предполагается использовать их побочные эффекты, а не возвращаемое значение.

Привязанная служба

Связанный сервис объяснить сложнее. Хотя при внимательном рассмотрении эта метафора не выдерживает критики, связанный сервис чем-то напоминает фабрику-одиночку. Это, например, способ предоставления одного объекта с единым состоянием для всех действий в приложении. Среди его интересных особенностей заключается в том, что пока служба, предоставившая одноэлементный объект, привязана, процесс размещения с меньшей вероятностью будет уничтожен. Обратите внимание, что «одноэлементный» объект, предоставляемый связанной службой, имеет мало общего со службой, которая его предоставляет. Отмена привязки службы не делает ее недействительной.

Связанные сервисы также являются основным средством межпроцессного взаимодействия в Android.

Что делать?

Ну, это довольно общий вопрос. Вот мысль. Размещение вашего музыкального плеера в сервисе имеет большой смысл. Если связь с ним в основном односторонняя - команды службе - есть вероятность, что вы можете сделать это с помощью IntentService. Пока нет конкретной причины сделать что-то более сложное, IntentService имеет то преимущество, что он проще.

person G. Blake Meike    schedule 07.02.2016
comment
Спасибо за полный ответ. Есть ли какие-нибудь хорошие статьи или книги для чтения о внутреннем устройстве сервисов, которые вы можете порекомендовать? - person CROSP; 07.02.2016
comment
Я подозреваю, что это не тот ответ, который вам нужен, но я пишу его прямо сейчас: amazon.com/Android-Concurrency-G-Blake-Meike/dp/0134177436/ Должен выйти во 2-м квартале этого года. - person G. Blake Meike; 07.02.2016