Сервис против ИнтентСервис

Может кто-нибудь, пожалуйста, покажите мне пример того, что можно сделать с IntentService это не может быть сделано с Service (и наоборот)?

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

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

12 ответов

Решение

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

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

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

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

Как вызвать?

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

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

Запущен из

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

Работает на

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

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

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

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

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

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

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

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

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

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

Запуск службы с собственным потоком подобен запуску IntentService. Это не?

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

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

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

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

Все это может быть реализовано Service без расширения IntentService,

обслуживание

  • Вызвать startService()
  • Срабатывает от любого Thread
  • Работает на Main Thread
  • Может блокировать основной поток (пользовательский интерфейс). Всегда используйте поток внутри службы для долгой задачи
  • После того, как задача выполнена, мы обязаны прекратить обслуживание, позвонив stopSelf() или же stopService()

IntentService

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

Не изобретай велосипед

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

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

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

  • Создание рабочего потока

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

  • Уничтожая Service

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

"Главное" отличие

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

Как IntentService сделан из Service

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

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

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

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

Различия

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

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

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

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. Начиная с версии 4.0 Android, все сетевые операции должны выполняться в фоновом режиме, в противном случае сборка / сборка приложения завершится неудачно. отдельный поток от пользовательского интерфейса. Класс AsyncTask предоставляет один из самых простых способов запуска новой задачи из потока пользовательского интерфейса. Более подробное обсуждение этой темы смотрите в блоге.

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

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

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

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

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

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

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

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

IntentService является предпочтительным способом для простых фоновых операций

**

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

Существует библиотека, которая называется volley-library для разработки приложений для Android-сетей. Исходный код доступен для всех на GitHub.

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

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

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

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

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

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

IntentService

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

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

обслуживание

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

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

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

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

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

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

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

Android IntentService против службы

1. обслуживание

  • Служба вызывается с помощью startService().
  • Службу можно вызвать из любого потока.
  • Служба по умолчанию выполняет фоновые операции в основном потоке приложения. Следовательно, он может заблокировать пользовательский интерфейс вашего приложения.
  • Служба, вызываемая несколько раз, создаст несколько экземпляров.
  • Службу необходимо остановить с помощью stopSelf() или stopService().
  • Сервис Android может выполнять параллельные операции.

2. IntentService

  • IntentService вызывается с помощью Intent.
  • IntentService может быть вызван только из основного потока.
  • IntentService создает отдельный рабочий поток для выполнения фоновых операций.
  • IntentService, вызываемый несколько раз, не создает несколько экземпляров.
  • IntentService автоматически останавливается после завершения очереди. Нет необходимости запускать stopService() или stopSelf().
  • В IntentService несколько вызовов намерений автоматически ставятся в очередь, и они будут выполняться последовательно.
  • IntentService не может выполнять параллельную операцию, как службу.

Обратитесь отсюда

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

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

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

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

Обслуживание:

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

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

IntentService:

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

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

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

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

Различия

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

  • IntentService создает очередь, которая передает одно намерение за раз в onHandleIntent(). Таким образом, реализация многопоточности должна осуществляться путем непосредственного расширения класса Service. Класс обслуживания нуждается в ручной остановке с помощью stopSelf(). Между тем IntentService автоматически останавливается, если в очереди нет намерений.

  • IntentService реализует onBind(), который возвращает null. Это означает, что IntentService не может быть привязан по умолчанию.

  • IntentService реализует onStartCommand(), который отправляет Intent в очередь и onHandleIntent(). Короче говоря, есть только две вещи, которые нужно сделать, чтобы использовать IntentService. Во-первых, реализовать конструктор. И во-вторых, реализовать onHandleIntent(). Для других методов обратного вызова необходимо вызвать super, чтобы его можно было правильно отслеживать.

Короче

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

Из документов:

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

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

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

1. Управление потоками. Он автоматически обрабатывает все входящие запросы в отдельном потоке, снимая бремя управления потоками с разработчика.

2. Очередь запросов: она ставит в очередь все входящие запросы, и они обрабатываются один за другим.

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

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

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

Intent Service - идеальная реализация Сервиса, которая подойдет вам в большинстве ваших требований.

Основное отличие:

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

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

Другие вопросы по тегам