2015-05-14 3 views
1

Итак, я работаю с локальной службой, и я хотел бы, чтобы активность посылала службе некоторые команды. Помимо запуска и остановки, мне также хотелось бы приостановить или перезапустить команду для активности, которую выполняет моя служба (команды здесь не так важны, просто приводя их в качестве примеров.Локальная служба привязки в Android - использовать ... или не использовать?

Я думаю, что привязка к сервис будет правильный способ сделать это, но я не уверен в двух вещах.

  1. андроид документы говорят, что развязывание от службы будет убить его. что делать, если я хочу, чтобы моя служба работать в фоновом режиме ... тогда, когда моя активность onCreate() s я хочу связать с Сервисом (для управления им/отправкой его команд) и onDestroy(), я хотел бы отменить действие из службы, но продолжаю работу службы.

  2. У меня возникли проблемы с пониманием этот отрывок из книги Big Nerd Ranch по разработке Android

Этот шаблон выглядит интересно. Это единственное место в Android, которое позволяет одному компоненту Android напрямую разговаривать с другим. Однако мы не рекомендуем . Поскольку сервисы - это эффективные синглтоны, то они используют , поэтому они не дают больших преимуществ только при использовании одноточечного .

По существу, я говорю, что привязка - это api, которая просто делает вещи слишком сложными, чтобы действительно использовать для локальной службы?

ответ

4

В андроидных документах говорится, что отказ от службы убьет его.

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

Что делать, если я хочу, чтобы моя служба работать в фоновом режиме ... тогда, когда моя активность OnCreate() s Я хочу, чтобы привязать к службе (для управления его/отправить его команды) и OnDestroy() I» d хотел бы развязать Activity из службы, но продолжайте работу службы.

Вы должны использовать оба startService() (лучше контролировать продолжительность службы) и bindService() тогда. И если все, что вы делаете, это отправка команд, я бы пропустил bindService() и просто отправлю команды через startService().

У меня возникли проблемы с пониманием этого отрывка из книги Big Nerd Ranch на Android развития

Последнее цитируемый приговор ... странно.

По существу, я говорю, что привязка - это api, которая просто делает вещи слишком сложными, чтобы действительно использовать для локальной службы?

Это разумная интерпретация цитируемого отрывка.

Лично я нахожу привязку к боли в различных частях тела, больше, чем это стоит для местных служб. A сервис важен, как указание на ОС, что вы выполняете фоновый подход, чтобы поддерживать ваш процесс немного дольше. Но я буду использовать шаблоны команд и шины событий над локальной привязкой. Само связывание - это состояние, состояние, которому необходимо управлять в отношении изменений конфигурации. Оставшиеся фрагменты делают это легче, чем раньше, но он все еще усугубляется.

Образец привязки более важен для удаленных служб, где клиент и служба находятся в отдельных приложениях. Хотя это создает целый ряд новых и захватывающих проблем, в Android существует только так много вариантов IPC, а удаленные службы предлагают варианты, которые трудно реализовать, используя другие варианты IPC.

+0

Спасибо за ответ. Я хотел бы держаться подальше от eventbus libs (пока), но настроить LocalBroadcastReciever кажется прекрасным для Service -> Activity, но как вы порекомендовали Activity -> Service commands? С помощью функции startService() снова? – EGHDK

+0

@EGHDK: «но настройка LocalBroadcastReciever кажется прекрасной для Сервиса» - если вы хотите работать с структурами «Intent», и вы хотите, чтобы результаты всегда доставлялись по основному потоку приложения, «LocalBroadcastManager» в порядке. «Как бы вы порекомендовали Activity -> Service commands?» С помощью функции startService() снова? » -- конечно. – CommonsWare

+0

Еще две вещи! 1. Чтобы быть уверенным, что вы говорите startService() с другим Intent дополнительным, как команда, правильно? Потому что тогда onCreate не будет вызван, но onStartCommand будет вызван, и я могу по существу использовать его как метод маршрутизатора. 2. «ничто не вызвало startService() в сервисе, чтобы он работал таким образом« Подождите, я знаю, что могу просто зарегистрировать это, но даже прочитав документы, я думал, что onBind все равно вызовет onStartCommand() – EGHDK

0
  1. Да, отказ от службы уничтожит сервис, если только он не был запущен первым. Так что если вы запустите службу, а затем привязать к нему, он будет выжить вашей деятельности отдых (убедитесь, что вы остановить службу в какой-то момент с stopSelf(). Об этом говорится в the docs о связанных услугах.

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

+0

Я понимаю, что Сервис -> Активность с LocalBroadcast будет работать. Как я могу отправить команду из Activity -> Service? – EGHDK

+1

Операция может иметь ссылку на экземпляр службы, поэтому вы можете вызывать методы на ней из действия. См. Примеры кода в приведенной выше документации docs. Если вы привязываетесь к сервису, он возвращает объект связующего. Используйте это, чтобы получить ссылку на свою службу, затем вы можете вызвать общедоступные методы в службе. – JPS

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

  • Нет связанных вопросов^_^