Когда использовать поток / сервис в Android? - PullRequest
28 голосов
/ 28 октября 2011

Когда следует использовать поток или сервис?

Должны ли они использоваться для аутентификации? Например, в моем приложении я рассматривал возможность использования потока или службы (я проверяю подлинность через Active Directory.)

У вас есть примеры использования каждого из них?

Ответы [ 6 ]

47 голосов
/ 29 октября 2011

Обновление: Похоже, в документации по Android теперь есть соответствующие пояснения, см. http://developer.android.com/reference/android/app/Service.html#WhatIsAService.

Оригинальный ответ:

В Android,Service не обеспечивает одновременного выполнения («запуск в фоновом режиме»).На самом деле это скорее простой Java-объект, который просто создается (и управляется) через систему Android, а не через ваше приложение через new.

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

Что делает сервисный объект особенным, так это то, что он зарегистрирован в системе Android как сервис .Это даст системе знать, что этот объект предоставляет какую-то услугу, и должен оставаться в живых как можно дольше или до его остановки.Обычные потоки приложений не имеют этого специального значения для системы Android и будут прерваны гораздо более щедро по усмотрению системы.

Так что, если вам нужны некоторые фоновые действия, которые будут выполняться только тогда, когда ваше приложение / Activity активен, поток может делать то, что вам нужно.

Если вам нужен компонент, который сохраняет активность не будет очищен, даже если через некоторое время система Android решит удалитьваш Activities из памяти, вы должны пойти на сервис или даже на «приоритетный сервис», который считается еще более важным для системы и еще менее вероятно, что он будет прерван для восстановления ресурсов.

Конечнопри желании можно также создать объект Service, содержащий один или несколько экземпляров Thread, которые могли бы жить столько же времени, сколько сам объект Service.

Редактировать:

О, плюс: услуга - это, конечно, способ , если вы хотите предоставлять некоторые услуги другим приложениям, которые могут «привязываться» только к услуге.

26 голосов
/ 28 октября 2011

Поток должен использоваться в длительном процессе, который блокирует обновление пользовательского интерфейса.Если это больше, чем секунда или две, вы можете поместить его в фоновый поток и уведомить пользователя с помощью диалогового окна или спиннера или чего-то еще.Если вы заблокируете поток пользовательского интерфейса более чем на 5 секунд, операционная система предложит пользователю опцию «убить или подождать».

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

4 голосов
/ 28 октября 2011
3 голосов
/ 28 октября 2011

Используйте сервис, если вам нужно что-то, что либо используется другими приложениями, либо переживает ваши действия приложения. Хорошим примером службы является передача файлов, которая может занять много времени, и вы не хотите, чтобы пользователь использовал ваше приложение в это время. В других случаях используйте thread (обычно через AsyncTask или аналогичный).

Для целей аутентификации AsyncTask кажется хорошим выбором.

1 голос
/ 31 декабря 2014

Согласно руководству для разработчиков Android (http://developer.android.com/guide/components/services.html#Basics):

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

Если вам нужно выполнять работу вне основного потока, но только в то время, когда пользователь взаимодействует с вашим приложением, то вам, вероятно, следует вместо этого создать новый поток, а не службу. Например, если вы хотите воспроизвести какую-то музыку, но только во время работы, вы можете создать поток в onCreate (), запустить его в onStart (), а затем остановить в onStop (). Также рассмотрите возможность использования AsyncTask или HandlerThread вместо традиционного класса Thread. Для получения дополнительной информации о потоках см. Документ «Процессы и потоки».

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

1 голос
/ 11 ноября 2013

Я считаю, что основное отличие заключается в отношении системы Android. Сервис является частью инфраструктуры Android, поэтому Android распознает сервис как рабочую часть приложения и рассматривает уничтожение сервиса как последний вариант. Более того, вы можете настроить приоритет обслуживания, чтобы сделать его таким же важным, как и передний план. Что касается потоков, Android не признает поток как важную часть, которая должна быть сохранена. Так что обычные темы имеют гораздо больше шансов быть убитыми.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...