Подтвердить что ты не робот

Android service startService() и bindService()

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

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

4b9b3361

Ответ 1

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

Ответ 2

Если вы запустите службу, используя 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, если у вас нет разрешения на остановку данной службы.

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

Ответ 3

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

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

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

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

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

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

От Служба ref:

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