0

Я занимаюсь разработкой приложения MusicPlayer, и я использую локальную службу, чтобы сделать MediaPlayer запущенным в фоновом режиме. Кажется, что мы можем либо отправить намерение начать сервис, либо связать службу. Я понимаю смысл startService, мы оставляем его запущенным и отправляем намерение stopService, а для bindService мы возвращаем IBinder для связи с сервисом. Однако мне интересно, что с этим нужно сделать? Должны ли мы отправлять намерения, чтобы они работали? Если я просто получаю статический экземпляр Сервиса и напрямую вызываю его методы, я также могу реализовать как запустить его, так и связаться с ним.Служба Android, нужно ли использовать startService или BindService?

Я нашел пример не использовать startService и bindService, но он отлично работает как простой MusicPlayer.

фрагмент вызовов Услуга: https://github.com/zacharytamas/spotify-sampler/blob/master/app/src/main/java/com/zacharytamas/spotifysampler/ui/PlayerFragment.java

Сервис Класс: https://github.com/zacharytamas/spotify-sampler/blob/master/app/src/main/java/com/zacharytamas/spotifysampler/services/PlayerService.java

ответ

1

Однако, я задаюсь вопросом, какой смысл делать это?

Чтобы служба работала, чтобы сообщить операционной системе «эй, мы делаем работу здесь от имени пользователя, пожалуйста, пусть мой процесс будет жить дольше».

Это описано в the documentation.

Нужно ли посылать намерения, чтобы заставить его работать?

Да.

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

Тогда это просто объект Java, и нет смысла наследовать от Service. Кроме того, это означает, что ваш процесс будет работать в течение меньшего времени, когда ваш интерфейс не находится на переднем плане.

Я нашел пример не использовать startService и bindService, но он хорошо работает как простой MusicPlayer.

Начато обслуживание, через startService(), in ArtistSearchActivity. Пока это не будет сделано, службы не существует, а синглтон будет null.

+0

Благодарю вас, я не заметил, что startService().Но эта реализация по-прежнему совсем другая, она использует startService(), но все же взаимодействует с сервисом путем регистрации пользовательских событий, могу ли я сказать, что это еще одна форма IBinder, например, пользовательская реализация EventBus? – dengn

+0

@dengn: «все еще общается с сервисом, регистрируя пользовательские события» - я этого не вижу, извините. «Могу ли я сказать, что это еще одна форма IBinder» - нет. Это всего лишь реализация одноэлементного шаблона. Также, пожалуйста, не предполагайте, что код, который находится на GitHub, обязательно является кодом производственного класса. В этом случае разработчик запускает сервис и никогда не останавливает его. Это нарушает правило с сервисами: [только они работают, когда они активно доставляют ценность пользователю] (https://commonsware.com/blog/2014/07/27/role-services.html). – CommonsWare

0

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

В вашем приложении, я думаю, вы свяжетесь со службой (например, если у вас есть активность, в которой вы выбираете песню, то вы отправите данные в службу, чтобы сказать: «это песня, которую вы должны играть сейчас »), и я думаю, вам понадобится BindService вместо startService.

Я надеюсь, что это вам поможет: D