Служба vs IntentService

может кто-то пожалуйста, покажите мне пример того, что можно сделать с помощью IntentService Это невозможно сделать с помощью Service (и наоборот)?

Я также считаю, что IntentService работает в другом потоке и Service нет. Итак, насколько я могу видеть, запуск службы в собственном потоке похож на запуск IntentService. Не так ли?

Я был бы признателен, если кто-то может помочь мне с моими вопросами.

12 ответов


Tejas Lagvankar написал хороший в должности об этом предмете. Ниже приведены некоторые ключевые различия между Service и IntentService.

когда использовать?

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

  • на IntentService можно использовать в длинных задачах обычно без связи с основным потоком. Если требуется связь, можно использовать обработчик основного потока или широковещательные намерения. Другой случай использования - когда необходимы обратные вызовы (задачи, вызванные намерением).

как триггер?

  • на сервис запускается методом вызова startService().

  • на IntentService запускается с помощью намерения, он порождает нового работника нить и метод onHandleIntent() вызывается в этом потоке.

Срабатывает От

  • на сервис и IntentService может запускаться из любого потока, действия или другого компонента приложения.

Работает На

  • на сервис работает в фоновом режиме, но она работает в основном потоке приложения.

  • на IntentService выполняется в отдельном рабочем потоке.

Ограничения / Недостатки

  • на сервис может блокировать основной поток приложения.

  • на IntentService не выполнять задачи параллельно. Следовательно, все последовательные намерения войдут в очередь сообщений для рабочего потока и будут выполняться последовательно.

когда остановиться?

  • если вы реализуете сервис, это ваша ответственность, чтобы остановить службу, когда ее работа будет сделана, позвонив stopSelf() или stopService(). (Если вы хотите предоставить только привязку, вам не нужно реализовывать этот метод).

  • на IntentService останавливает службу после того, как все запросы запуска были обработаны, поэтому вам никогда не придется звоните stopSelf().


если кто-то может показать мне пример чего-то, что вы можете сделать с помощью intentService и не можете сделать с помощью сервиса и наоборот.

по определению, это невозможно. IntentService является наследником Service, написан на Java. Следовательно, что IntentService, и Service можно сделать, включив соответствующие биты кода IntentService использует.

запуск службы с собственным потоком похож на запуск в IntentService. Не так ли?

три основные особенности IntentService являются:

  • фоновый поток

  • автоматическая расстановка Intent s доставлено в onStartCommand(), так что если один Intent обрабатывается onHandleIntent() в фоновом потоке другие команды выстраиваются в очередь, ожидая своей очереди

  • автоматическое отключение IntentService, через вызов stopSelf(), когда очередь пусто

все это может быть реализовано с помощью Service без продления IntentService.


сервис

  • Invoke by startService()
  • срабатывает от любого Thread
  • работает на Main Thread
  • может блокировать основной поток (UI). Всегда используйте поток внутри службы для long task
  • после того, как задача выполнена, это наша ответственность, чтобы остановить обслуживание, позвонив stopSelf() или stopService()

IntentService

  • он выполняет длинную задачу обычно нет связь с основным потоком если связь необходима, то это делается Handler или BroadcastReceiver
  • вызвать через Intent
  • срабатывает от Main Thread
  • выполняется в отдельном потоке
  • не удается запустить задачу параллельно, и несколько намерений находятся в очереди в одном рабочем потоке.

различия

  1. класс обслуживания использует main поток, в то время как IntentService создает worker thread и использует этот поток для запуска службы.
  2. IntentService создает очередь, которая передает одно намерение за раз в onHandleIntent(). Таким образом, реализация многопоточности должна быть выполнена путем прямого расширения класса обслуживания.
  3. класс обслуживания нуждается в ручной остановке с помощью stopSelf(). Между тем, IntentService автоматически останавливается, когда в очереди нет намерения, обрабатываются все поставленные в очередь намерения.
  4. IntentService реализует onBind() это возвращает null. Это означает, что IntentService не может быть привязан по умолчанию.
  5. IntentService реализует onStartCommand() который отправляет намерение в очередь и onHandleIntent ().

добавление точек к принятому ответу:

см. использование IntentService в API Android. например:

public class SimpleWakefulService extends IntentService {
    public SimpleWakefulService() {
        super("SimpleWakefulService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {  ...}

чтобы создать компонент IntentService для вашего приложения, определите класс, который расширяет IntentService, и в нем определите метод, который переопределяет onHandleIntent().

Также см. исходный код IntentService, это методы конструктора и жизненного цикла, такие как onStartCommand...

  @Override
    public int More ...onStartCommand(Intent intent, int flags, int startId) {
       onStart(intent, startId);
        return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
    }

сервис вместе AsyncTask является одним из лучших подходов для многих используйте случаи, когда полезная нагрузка не огромна. или просто создайте класс расширение IntentSerivce. От Android версии 4.0 вся сеть операции должны находиться в фоновом процессе, иначе компиляция/сборка приложения завершится неудачно. отделите поток от пользовательского интерфейса. Класс AsyncTask предоставляет один из самых простых способов запуска новой задачи из потока пользовательского интерфейса. Для более подробного обсуждения этой темы см. сообщение в блоге

С Android разработчики руководства:

IntentService является базовым классом для служб, которые обрабатывают асинхронные запросы (выраженные как намерения) по требованию. Клиенты отправляют запросы через вызовы startService (Intent); служба запускается по мере необходимости, обрабатывает каждое намерение, в свою очередь, используя рабочий поток и останавливается, когда он заканчивается.

шаблон проектирования, используемый в IntentService

: Этот шаблон "обработчик рабочей очереди" обычно используется для выгрузка задач из основного потока приложения. Класс IntentService существует, чтобы упростить этот шаблон и позаботиться о механике. Чтобы использовать его, расширьте IntentService и реализуйте onHandleIntent(Intent). IntentService получит намерения, запустит рабочий поток и остановит службу по мере необходимости.

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

класс IntentService предоставляет простую структуру для выполнения операции в одном фоновом потоке. Это позволяет ему обрабатывать длительные операции, не влияя на отзывчивость пользовательского интерфейса. Кроме того, IntentService не зависит от большинства событий жизненного цикла пользовательского интерфейса, поэтому он продолжает работать в обстоятельствах, которые завершили бы AsyncTask.

IntentService имеет несколько ограничений:

Он не может напрямую взаимодействовать с пользовательским интерфейсом. Чтобы поместить его результаты в пользовательский интерфейс, вы должны отправить их в действие. Запросы выполняются последовательно. Если операция выполняется в IntentService и вы отправляете ей другой запрос, запрос ожидает завершения первой операции. Операция, выполняемая на IntentService, не может быть прервана. Однако, в большинстве случаев

IntentService-предпочтительный способ простого фона операции

**

Залп Библиотека

есть библиотека под названием volley-библиотека для разработки сетевых приложений android Исходный код доступен для общественности в GitHub.

официальная документация android для лучшие практики для фоновых заданий: помогает лучше понять службу intent, поток, обработчик, службу. а также Исполнительского Сети Операции


Я уверен, что вы можете найти обширный список различий, просто погуглив что-то вроде "Android IntentService vs Service"

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

некоторые примеры (быстро составленные) могут быть;

IntentService: если вы хотите загрузить много картинок в начале открытия вашего приложения. Это одноразовый процесс и может очистить себя, как только все будет загруженный.

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


IntentService

IntentService работает в своем собственном потоке. Он остановится, когда закончит. Скорее огонь и забвение. Последующие вызовы будут поставлены в очередь. Хорошо для очередей. Вы также можете вращать несколько потоков в IntentServiceЕсли вам нужно - вы можете добиться этого, используя ThreadPoolExecutor. Я говорю это, потому что многие люди спрашивали меня: "зачем использовать IntentService Так как он не поддерживает параллельное выполнение". IntentService Это просто поток. Вы можете делать все, что вам нужно внутри него-даже вращаясь несколько нити. Единственное предостережение-это IntentService заканчивается, как только вы вращаете эти несколько потоков. Он не ждет, пока эти нити вернутся. Ты должен позаботиться об этом. Поэтому я рекомендую использовать ThreadPoolExecutor в этих сценариях.

  • хороший для синхронизации, загрузки и т. д ...

сервис

По Умолчанию Service выполняется в основном потоке. Для выполнения своей работы вам нужно закрутить рабочий поток. Вы должны остановить service явно. Я использовал его для ситуация, когда вам нужно запустить материал в фоновом режиме, даже когда вы отойдете от своего приложения и вернетесь больше для безголового service.

  • снова вы можете запустить несколько потоков, если вам нужно.
  • может использоваться для приложений, таких как музыкальные плееры.

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


IntentService-это расширение службы, предназначенное для облегчения выполнения задачи, которая должна выполняться в фоновом режиме и в отдельном потоке.

IntentService запускается, создает поток и запускает его задачу в потоке. после этого, она очищает все. Только один экземпляр IntentService может работать одновременно несколько вызовов в очередь.

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

например, служба, подключенная к серверу xmpp и связанная действиями, не может быть просто выполнена с помощью IntentService. Вы в конечном итоге игнорируете или переопределяете материалы IntentService.


если кто-то может показать мне пример чего-то, что можно сделать с помощью IntentService и не может быть сделано с помощью service и наоборот.

IntentService не может использоваться для длительного прослушивания, как для слушателей XMPP, его один оператор времени, сделать работу и помахать на прощание.

также у него есть только один threadworker, но с трюком вы можете использовать его как неограниченный.


не изобретайте колесо

IntentService выходит сервис класс, который явно означает, что IntentService умышленно, за то же самое цель.

так в чем же цель ?

`цель IntentService - сделать нашу работу проще для выполнения фоновых задач, даже не беспокоясь о

  • создание рабочего нить

  • очередь обработки нескольких запросов один за другим (Threading)

  • уничтожение Service

так нет, Service любая задача которого IntentService будет делать. Если ваши требования подпадают под вышеупомянутые критерии, то вам не нужно писать эти логики в Service класса. Так что не изобретайте колесо, потому что IntentService Это изобрел колесо.

"Основной" разница

служба работает в потоке пользовательского интерфейса, в то время как IntentService работает на отдельная нить

как IntentService состоит из Service

обычная служба работает в потоке пользовательского интерфейса(любой тип компонента Android работает в потоке пользовательского интерфейса по умолчанию, например Activity, BroadcastReceiver, ContentProvider и Service). Если вам нужно выполнить некоторую работу, которая может занять некоторое время, вам нужно создать поток. В случае нескольких запросов, вам придется разберись с synchronization. IntentService дается некоторая реализация по умолчанию, которая выполняет эти задачи для вас.
Согласно страница разработчика

  1. IntentService создает рабочий поток

  2. IntentService создает рабочую очередь, которая отправляет запрос в onHandleIntent() метод один за другим

  3. когда нет работы, то IntentService звонки stopSelf() метод
  4. обеспечивает реализацию по умолчанию для onBind() метод, который равен null
  5. реализация по умолчанию для onStartCommand() который посылает Intent запрос на WorkQueue и в конечном итоге к onHandleIntent()

основные отличия :

  1. Service класс нуждается в ручной остановке с помощью stopSelf(). А пока ... --2-- > автоматически останавливается, когда нет намерения в очереди.

  2. на IntentService может использоваться в длинных задачах обычно, но если вам нужно выполнять длинные задачи, вы должны использовать потоки в Service.


основное различие между Service и IntentService описывается следующим образом:

сервис :

1.А Service по умолчанию выполняется в основном потоке приложения.(здесь рабочий поток по умолчанию недоступен).Поэтому пользователю необходимо создать отдельный поток и выполнить необходимую работу в этом потоке.

2.Позволяет выполнять несколько запросов одновременно.(Многопоточность)

IntentService :

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

2.Но это позволяет только один запрос за раз.