Я ищу пример того, что может быть сделано с помощью, IntentService
что не может быть сделано с Service
(и наоборот)?
Я также считаю, что он IntentService
работает в другом потоке, а Service
нет. Итак, насколько я вижу, запуск службы в своем собственном потоке похож на запуск IntentService
. Это верно?
IntentService is used for short tasks (etc) and a service is for long ones
где ты это прочитал?Ответы:
Теджас Лагванкар написал хороший пост на эту тему. Ниже приведены некоторые ключевые различия между Service и IntentService.
Когда использовать?
Сервис может быть использован в задачах, не имеющих пользовательского интерфейса, но не должно быть слишком длинным. Если вам нужно выполнять длинные задачи, вы должны использовать потоки в Сервисе.
IntentService можно использовать в длинных задачах , как правило, без связи с основным потоком. Если требуется связь, можно использовать обработчик основного потока или широковещательные намерения. Другой случай использования - когда требуются обратные вызовы (задачи, инициируемые намерением).
Как вызвать?
Служба запускается с помощью вызова метода
startService()
.IntentService срабатывает используя Намерение, создается новый рабочий поток и метод
onHandleIntent()
вызывается в этом потоке.Запущен из
Работает на
Служба работает в фоновом режиме , но он работает на главном потоке приложения.
IntentService работает на отдельном потоке.
Ограничения / Недостатки
Служба может блокировать главный поток приложения.
IntentService не может выполнять задачи параллельно. Следовательно, все последовательные намерения будут помещены в очередь сообщений для рабочего потока и будут выполняться последовательно.
Когда остановиться?
Если вы внедряете Сервис , вы обязаны остановить сервис после завершения его работы, позвонив по телефону
stopSelf()
илиstopService()
. (Если вы хотите предоставить только привязку, вам не нужно реализовывать этот метод).IntentService останавливает службу после того, как все запросы начала были обработаны, так что вы никогда не должны вызовом
stopSelf()
.источник
По определению это невозможно.
IntentService
это подклассService
, написанный на Java. Следовательно, все, чтоIntentService
делает,Service
может сделать, включая соответствующие биты кода, которыйIntentService
использует.Три основные особенности
IntentService
:фоновый поток
автоматическая очередь
Intent
s доставляетсяonStartCommand()
, поэтому, если одинIntent
обрабатываетсяonHandleIntent()
в фоновом потоке, другие команды выстраиваются в очередь в ожидании своей очередиавтоматическое отключение
IntentService
через вызовstopSelf()
, когда очередь пустаВсе это может быть реализовано
Service
без расширенияIntentService
.источник
Service
вызов сstartService
может выполняться только в течение примерно 10 секунд, прежде чем выбросить ANR -IntentService
начало с трансляции намерения, похоже, не имеет этого ограниченияonStartCommand()
aService
, вызываются в главном потоке приложения. Вы не можете связать этот поток более чем на несколько миллисекунд, не заморозив свой пользовательский интерфейс, и если вы потратите много секунд, вы получите сервисный эквивалент ANR.onStartCommand
вместоonHandleIntent
- похоже,onStartCommand
он запускается в потоке пользовательского интерфейса, однако дляonHandleIntent
выполнения создается отдельный поток .IntentService
вызывает послеonHandleIntent()
возврата, если больше нет работы.обслуживание
startService()
Thread
Main Thread
stopSelf()
илиstopService()
IntentService
Handler
илиBroadcastReceiver
Intent
Main Thread
источник
Не изобретай велосипед
IntentService расширяет класс Service, что явно означает, что
IntentService
сделано специально для же цели.Так в чем же цель?
`Цель IntentService - облегчить нашу работу для выполнения фоновых задач, даже не беспокоясь о
Создание рабочего потока
Очередь обработки нескольких запросов по одному (
Threading
)Service
Таким образом, НЕТ ,
Service
может выполнить любую задачу, котораяIntentService
будет делать. Если ваши требования подпадают под вышеупомянутые критерии, вам не нужно писать эту логику вService
классе. Так что не изобретай велосипед, потому чтоIntentService
это изобретенное колесо.«Главное» отличие
Когда вы используете IntentService?
Если вы хотите выполнить несколько фоновых задач одну за другой, которая выходит за рамки действия, тогда
IntentService
все идеально.Как
IntentService
сделано изService
Обычный сервис работает в потоке пользовательского интерфейса (любой тип компонента Android по умолчанию работает в потоке пользовательского интерфейса, например
Activity
:BroadcastReceiver
,ContentProvider
иService
). Если вам нужно выполнить какую-то работу, которая может занять некоторое время, то вы должны создать поток. В случае нескольких запросов вам придется иметь дело сsynchronization
.IntentService
дается некоторая реализация по умолчанию, которая выполняет эти задачи за вас.По словам разработчика
IntentService
создает рабочий потокIntentService
создает рабочую очередь, которая отправляет запросonHandleIntent()
методу один за другимIntentService
вызываетstopSelf()
методonBind()
метода, который является нулевымonStartCommand()
которой отправляетIntent
запрос в WorkQueue и, в конце концов,onHandleIntent()
источник
Добавление баллов к принятому ответу:
Смотрите использование IntentService в Android API. например:
Чтобы создать компонент IntentService для вашего приложения, определите класс, который расширяет IntentService, и в нем определите метод, который переопределяет onHandleIntent ().
Также см. Исходный код IntentService, его конструктор и методы жизненного цикла, такие как onStartCommand ...
из руководства разработчика Android :
IntentService - это базовый класс для служб, которые обрабатывают асинхронные запросы (выраженные как Intents) по требованию. Клиенты отправляют запросы через вызовы startService (Intent); служба запускается по мере необходимости, обрабатывает каждое намерение, в свою очередь, используя рабочий поток, и останавливается, когда заканчивается его работа.
: Этот шаблон «обработчик рабочей очереди» обычно используется для выгрузки задач из основного потока приложения. Класс IntentService существует, чтобы упростить этот шаблон и позаботиться о механике. Чтобы использовать его, расширьте IntentService и внедрите onHandleIntent (Intent). IntentService получит Intents, запустит рабочий поток и остановит службу соответствующим образом.
Все запросы обрабатываются в одном рабочем потоке - они могут занимать столько времени, сколько необходимо (и не будет блокировать основной цикл приложения), но одновременно обрабатывается только один запрос.
Класс IntentService предоставляет простую структуру для выполнения операции в одном фоновом потоке. Это позволяет ему обрабатывать длительные операции, не влияя на отзывчивость вашего пользовательского интерфейса. Кроме того, IntentService не подвержен влиянию большинства событий жизненного цикла пользовательского интерфейса, поэтому он продолжает работать при обстоятельствах, приводящих к отключению AsyncTask.
IntentService имеет несколько ограничений:
Он не может напрямую взаимодействовать с вашим пользовательским интерфейсом. Чтобы поместить его результаты в пользовательский интерфейс, вы должны отправить их в Activity. Рабочие запросы выполняются последовательно. Если операция выполняется в IntentService, и вы отправляете ему еще один запрос, запрос ожидает завершения первой операции. Операция, выполняемая на IntentService, не может быть прервана. Однако в большинстве случаев
**
Есть библиотека volley-library для разработки приложений для Android. . Исходный код доступен для всех на GitHub.
Официальная документация для Android по рекомендациям для фоновых заданий : помогает лучше понять намерение службы, потока, обработчика, службы. а также выполнение сетевых операций
источник
Я уверен, что вы можете найти обширный список различий, просто прибегая к помощи чего-то вроде «Android IntentService vs Service»
Одним из наиболее важных различий в каждом примере является то, что IntentService завершает себя, как только это будет сделано.
Некоторые примеры (быстро выдуманные) могут быть;
IntentService: если вы хотите загрузить несколько изображений в начале открытия вашего приложения. Это однократный процесс, который можно очистить после загрузки всего.
Сервис: Сервис, который будет постоянно использоваться для связи между вашим приложением и серверной частью с помощью вызовов веб-API. Даже если он закончил свою текущую задачу, вы все равно захотите, чтобы он был через несколько минут для большего общения.
источник
IntentService
IntentService
работает в собственном потоке. Это остановится, когда это будет сделано. Больше похоже на огонь и забудь. Последующие звонки будут поставлены в очередь. Хорошо для очередей звонков. Вы также можете вращать несколько потоков внутри,IntentService
если вам нужно - вы можете добиться этого, используяThreadPoolExecutor
. Я говорю это потому, что многие люди спрашивают меня «зачем использовать,IntentService
поскольку он не поддерживает параллельное выполнение».IntentService
это просто нить. Вы можете делать все, что вам нужно, даже вращая несколько нитей. Единственное предостережение заключается в том, что онIntentService
заканчивается, как только вы вращаете эти несколько потоков. Это не ждет, когда эти темы вернутся. Вы должны позаботиться об этом. Поэтому я рекомендую использоватьThreadPoolExecutor
в этих сценариях.обслуживание
По умолчанию
Service
работает в основном потоке. Вы должны крутить рабочий поток, чтобы сделать свою работу. Вы должны остановитьсяservice
явно. Я использовал это для ситуации, когда вам нужно запускать вещи в фоновом режиме, даже когда вы уходите от своего приложения и возвращаетесь больше для Headlessservice
.Вы всегда можете связаться с вашей деятельностью, используя,
BroadcastReceivers
если вам нужно.источник
IntentService - это расширение службы, созданное для облегчения выполнения задачи, которая должна выполняться в фоновом режиме и в отдельном потоке.
IntentService запускается, создает поток и выполняет свою задачу в потоке. После того, как это сделано, он очищает все. Одновременно может работать только один экземпляр IntentService, несколько вызовов ставятся в очередь.
Он очень прост в использовании и очень удобен для многих применений, например, загрузки материалов. Но у него есть ограничения, которые могут заставить вас захотеть использовать вместо этого более базовый (не простой) Сервис.
Например, сервис, подключенный к серверу xmpp и связанный действиями, нельзя просто сделать с помощью IntentService. В конечном итоге вы проигнорируете или переопределите материалы IntentService.
источник
IntentService
не может использоваться для прослушивания в течение длительного времени, как и для прослушивателей XMPP, его единственный оператор времени, делает работу и машет на прощание.Также у него есть только один многопоточник, но с хитростью вы можете использовать его как неограниченный.
источник
Основное различие между a
Service
и aIntentService
описывается следующим образом:Обслуживание :
1.О
Service
по умолчанию запускается в главном потоке приложения (здесь рабочий поток по умолчанию недоступен). Таким образом, пользователь должен создать отдельный поток и выполнить необходимую работу в этом потоке.2. Позволяет несколько запросов одновременно. (Многопоточность)
IntentService:
1. Теперь, перейдя к
IntentService
, здесь рабочий поток по умолчанию доступен для выполнения любой операции. Обратите внимание, что - Вам необходимо реализоватьonHandleIntent()
метод, который получает намерение для каждого запроса на запуск, где вы можете выполнять фоновую работу.2. Но это позволяет только один запрос за один раз.
источник
Android IntentService vs Сервис
1.Service
2. ИнтентСервис
См. Здесь
источник