Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

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

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

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

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

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

Edit:

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

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

В соответствии с Руководством разработчика Android (http://developer.android.com/guide/components/services.html#Basics):

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

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

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