2010-08-18 2 views
47

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

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

ответ

80

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

+4

Как связать службу, запущенную с помощью startService()? – user123321

+3

@musselwhizzle: этот вопрос очень старый. Если у вас есть вопрос, начните новую тему вопроса. Но нет никакой разницы в методе, в котором вы привязываетесь к уже запущенной службе. – Falmarri

+1

Вы также должны отметить, что для того, чтобы полностью удалить службу из жизненного цикла действия, запустите службу, передав контекст приложения. Это означает, что услуга привязана к жизненному циклу приложения, а не к активности. Кроме того, просмотрите START_STICKY. Возвращаясь к запуску с использованием контекста приложения, вы можете удалить свою работу из жизненного цикла приложения и перезапустить его в случае сбоя, прежде чем завершить свою задачу. – superuserdo

8

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

я надеюсь, что это помогает ..

8

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

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

Хороший пример - музыкальное приложение. Объяснение от Building a Media Browser Service официального учебника:

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

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

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

От Service исх:

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

Смежные вопросы