Свяжите сервис с действием в Android

Я пытаюсь записать простой медиаплеер, который играет потоковое аудио с помощью RTSP. У меня есть действие GUI и обслуживание, которое выполняет воспроизведение. Мой вопрос состоит в том, как лучше всего связаться между действием и обслуживанием (например, обновление GUI на основе состояния плеера).

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

87
задан Alireza Noorali 10 November 2019 в 05:45
поделиться

2 ответа

«Если вы запустите службу Android с помощью startService (..) , эта служба будет работать до тех пор, пока вы явно не вызовете stopService (..) . Есть две причины, по которым служба может запускаться системой. Если кто-то вызовет Context.startService () , то система получит службу (создав ее и вызовет метод onCreate () , если необходимо), а затем вызовет его onStartCommand (Intent , int, int) с аргументами, предоставленными клиентом. В этот момент служба будет работать до тех пор, пока не будет вызвана Context.stopService () или stopSelf () . Обратите внимание, что несколько вызовов Context.startService () не вкладываются (хотя они действительно приводят к нескольким соответствующим вызовам onStartCommand () ), поэтому независимо от того, сколько раз он запускается, служба будет остановлена ​​после вызова Context.stopService () или stopSelf () ; Однако, службы могут использовать свой метод stopSelf (int) , чтобы гарантировать, что служба не будет остановлена ​​до тех пор, пока запущенные намерения не будут обработаны.

Клиенты также могут использовать Context.bindService () для получения постоянного соединения с услугой. Таким же образом создается служба, если она еще не запущена (при этом вызывается onCreate () ), но не вызывается onStartCommand () . Клиент получит объект IBinder , который служба возвращает из своего метода onBind (Intent) , позволяя клиенту затем выполнять обратные вызовы службы. Служба будет работать до тех пор, пока установлено соединение (независимо от того, сохраняет ли клиент ссылку на IBinder службы). Обычно возвращается IBinder для сложного интерфейса, который был написан на AIDL.

Служба может быть как запущена, так и связаны с ней соединения. В таком случае система будет поддерживать работу службы до тех пор, пока она запущена или есть одно или несколько подключений к ней с флагом Context.BIND_AUTO_CREATE . Если ни одна из этих ситуаций не выполняется, вызывается метод службы onDestroy () , и служба фактически прекращает работу. Вся очистка (остановка потоков, отмена регистрации получателей) должна быть завершена после возврата из onDestroy () . "

система будет поддерживать работу службы до тех пор, пока она запущена или есть одно или несколько подключений к ней с флагом Context.BIND_AUTO_CREATE . Если ни одна из этих ситуаций не выполняется, вызывается метод службы onDestroy () , и служба фактически прекращает работу. Вся очистка (остановка потоков, отмена регистрации получателей) должна быть завершена после возврата из onDestroy () . "

система будет поддерживать работу службы до тех пор, пока она запущена или есть одно или несколько подключений к ней с флагом Context.BIND_AUTO_CREATE . Если ни одна из этих ситуаций не выполняется, вызывается метод Службы onDestroy () , и служба фактически завершается. Вся очистка (остановка потоков, отмена регистрации получателей) должна быть завершена после возврата из onDestroy () . "

150
ответ дан 24 November 2019 в 07:46
поделиться

Существует метод под названием unbindService , который принимает ServiceConnection, который вы создадите при вызове bindService. Это позволит вам отключиться от службы, оставив ее работать.

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

Удачи!

5
ответ дан 24 November 2019 в 07:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: