0

У меня возникли трудности с пониманием того, когда следует использовать Сервис против IntentService в Android.Как создать службу, которая работает в фоновом режиме и выполняет задачи async в Android

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

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

Также необходимо запустить мероприятие для установки apk.

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

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

Например: Waiting for asynchronous callback in Android's IntentService

+0

Читайте о несвязанной службе. –

ответ

3

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

Предупреждения о запуске работы «async» внутри IntentService состоят в том, что, как только onHandleIntent завершает работу, IntentService считает, что элемент завершил обработку. У него нет способа узнать, создан ли другой поток, который вы хотите, чтобы он дождался. Поэтому, как только он вызвал onHandleIntent для всех выдающихся запросов, он будет закрыт, даже если есть дочерние потоки, все еще запущенные.

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

Это звучит на основе вашего описания, как вы, вероятно, есть два варианта:

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

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

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