"Если вы запустите службу 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()
. "