Разница между onStartCommand() и onBind()

#android #android-service

#Android #android-сервис

Вопрос:

Чем действие «привязки» onBind() метода отличается от простого вызова onStartCommand() ?

 onStartCommand()
 

«Система вызывает этот метод, когда другой компонент, такой как activity, запрашивает запуск службы путем вызова startService() » .

 onBind()
 

Система вызывает этот метод, когда другой компонент хочет связать со службой (например, для выполнения RPC), путем вызова bindService() .

Я хочу написать службу чат-клиента, которая получает сообщения от нескольких пользователей. Какая функция была бы более подходящей?

Ответ №1:

Первый ( onStartCommand() ) вызывается, когда ваш Service начинает выполнять свою работу. onCreate() завершено, и он готов приступить к выполнению того, что нужно сделать.

Второй ( onBind() ) вызывается, когда другой поток регистрируется для подключения к Службе, чтобы они могли обмениваться данными. Вы должны настроить или настроить средства для связи здесь, такие как проверка интерфейса или обратные вызовы для регистрации действия.

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

Ответ №2:

onStartCommand() и onBind() являются методами обратного вызова класса Service.

onStartCommand() вызывается после onCreate() метода класса обслуживания в первый раз.В следующий раз, когда любой другой компонент Android запустит ту же службу, служба получит новый запрос в onStartCommand() методе.

onBind() вызывается, когда другие компоненты Android пытаются подключиться к уже запущенной службе с помощью bindService() метода.Он используется для передачи какой-либо новой информации в службу или попытки установить служебное соединение.

Ответ №3:

Связанная служба завершится, когда к ней больше не будут привязаны действия. Привязка также позволяет отправлять ему дополнительные команды через такие интерфейсы, как AIDL . В вашем случае, я думаю, вам нужна связанная служба, поскольку вы, вероятно, не хотите, чтобы служба пережила действие.

Ответ №4:

Фактически, если компонент вызывает bindService() для создания службы и onStartCommand() не вызывается, служба выполняется только до тех пор, пока компонент привязан к ней. После того, как служба не привязана ко всем своим клиентам, система уничтожает ее. Итак, onBind() если действие уничтожит вашу службу, оно не сработает.

Ответ №5:

Согласно официальной документации, при запуске службы с помощью bindService()

если компонент (т.Е. Activity) вызывает bindService() для создания службы, а onStartCommand() не вызывается, служба выполняется только до тех пор, пока к ней привязан компонент. После того, как служба не привязана ко всем своим клиентам, система уничтожает ее.

и когда служба запускается с помощью startService()

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