Android-сервис startService () и bindService () - PullRequest
50 голосов
/ 18 августа 2010

Я хотел бы знать, возможно ли иметь службу, которая запускается с помощью startService, а затем иметь возможность также связываться с этой службой и выполнять некоторые удаленные вызовы процедур? в соответствии с этим: http://developer.android.com/guide/topics/fundamentals.html#servlife

два сервиса имеют разный жизненный цикл, поэтому это невозможно, кто-нибудь знает об этом?

Ответы [ 3 ]

90 голосов
/ 18 августа 2010

Я думаю, что ответ Хары был немного запутанным. То, что вы описываете, является совершенно законным и фактически единственным способом получить желаемое поведение. Если вы создадите сервис, связавшись с ним, он умрет, когда вы отмените привязку. Поэтому единственный способ сохранить его без привязки к нему действий - это запустить его с помощью startService (). Нет конфликта с жизненными циклами, потому что это относится только к тому, как служба запускается. Поэтому, как только он запускается с помощью startService (), он следует этому процессу жизненного цикла. Таким образом, вы можете связать и открепить его столько, сколько пожелаете, и он умрет, только когда вы вызовете stopService () или stopSelf ()

13 голосов
/ 14 февраля 2017

Да, вы можете запускать и связывать (один или несколько раз) один и тот же сервис.

Следующая блок-схема демонстрирует, как осуществляется управление жизненным циклом службы.Переменный счетчик отслеживает количество связанных клиентов: enter image description here

Хороший пример - музыкальное приложение.Объяснение из Создание службы медиабраузера Официальное руководство:

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

По этой причине вам нужно быть уверенным, что служба запускается, когда она начинает играть, вызывая startService (),Запущенная служба должна быть явно остановлена ​​независимо от того, связана она или нет.Это гарантирует, что ваш игрок продолжит выполнять, даже если управляющий пользовательский интерфейс отменяет привязку.

Чтобы остановить запущенную службу, вызовите Context.stopService () или stopSelf ().Система останавливается и уничтожает службу как можно скорее.Однако, если один или несколько клиентов по-прежнему связаны со службой, вызов для остановки службы задерживается до тех пор, пока все его клиенты не отсоединятся.

С Служба ref:

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

9 голосов
/ 18 августа 2010

Если вы запускаете службу с помощью startService (), то вам следует остановить ее с помощью stopService () .

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

Вы можете привязать к сервису столько ServiceConnection, сколько захотите, с помощью bindService () , но обратите внимание на флаг, который вы ему передали. Если вы передадите 0, то при вызове stopService () служба будет остановлена ​​(я не знаю точно, что происходит с вами ServiceConnection). В противном случае, если вы хотите, чтобы ваша служба работала до тех пор, пока ServiceConnection не будет привязана к ней, используйте BIND_AUTO_CREATE .

это из stopService ():

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

Обратите внимание, что если остановленная служба все еще имеет объекты ServiceConnection, связанные с ней с помощью набора BIND_AUTO_CREATE, она не будет уничтожена, пока не будут удалены все эти привязки. Более подробную информацию о жизненном цикле службы см. В документации по сервису.

Эта функция вызовет исключение SecurityException, если у вас нет разрешения на остановку данной службы.

Надеюсь, это поможет ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...