Intereting Posts
Как добавить два текстовых поля редактирования в диалоговом окне предупреждения Ionic android build Error – Не удалось найти переменную окружения ANDROID_HOME Можно ли обнаружить удаление Android-приложений? Удалить LoginActivity из Manifest – Facebook SDK для Android 3.0 Разница между build.gradle (Project) и build.gradle (Module) Получать миллисекунды до полуночи Как исправить ориентацию экрана для портрета для всего моего приложения PhoneGap Сотовые уведомления. Как установить largeIcon в нужный размер? Где получить информацию об ошибках базы данных в Android SQLite (например, неудачная вставка из-за нарушения не null) Использование фрагмента Android без использования UI Поддерживает ли андроид тип .jks keystore? Добавьте только верхнюю и нижнюю границу на LinearLayout Как избежать обратного проектирования файла APK? Класс Android VpnService и его класс-строитель Сбой приложения для Android (фрагмент и xml onclick)

Сервис против IntentService

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

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

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

Solutions Collecting From Web of "Сервис против IntentService"

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

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

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

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

Как запускать?

  • Служба запускается путем вызова метода startService() .

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

Выпущено из

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

Работает

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

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

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

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

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

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

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

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

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

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

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

Три основные функции IntentService :

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

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

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

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

Различия

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

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

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

IntentService

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

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

См. Использование 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 – это базовый класс для служб, которые обрабатывают асинхронные запросы (выраженные как намерения) по требованию. Клиенты отправляют запросы через вызовы startService (Intent); Служба запускается по мере необходимости, обрабатывает каждое намерение по очереди с использованием рабочего потока и останавливается, когда заканчивается работа.

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

: Этот шаблон «work queue processor» обычно используется для разгрузки задач из основного потока приложения. Класс 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 несколько потоков в IntentService если вам нужно – вы можете добиться этого с помощью ThreadPoolExecutor . Я говорю это, потому что многие люди спрашивали меня: «зачем использовать IntentService поскольку он не поддерживает параллельное выполнение». IntentService – это просто поток. Вы можете делать все, что вам нужно, внутри – даже вращая несколько потоков. Только оговорка заключается в том, что IntentService завершается, как только вы IntentService эти несколько потоков. Он не ждет, пока эти потоки вернутся. Вам нужно позаботиться об этом. Поэтому я рекомендую использовать ThreadPoolExecutor в этих сценариях.

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

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

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

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

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

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

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

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

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

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

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

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

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

  1. Для класса обслуживания требуется ручная остановка с использованием stopSelf (). Тем временем IntentService автоматически останавливается, когда в очереди нет намерений.

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

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

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

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

2.Allows Несколько запросов за раз. (Multi Threading)

IntentService:

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

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