Почему я должен использовать Android-сервис вместо потока Java - PullRequest
18 голосов
/ 16 марта 2012

Я запутался со службами Android и Java-потоком.

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

Согласно моему пониманию

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

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

Так в чем же разница между ними и временем использования каждого из них.

Ответы [ 7 ]

34 голосов
/ 16 марта 2012

Позвольте мне привести аналогию.

Деятельность и обслуживание похожи на проекты.

Действия похожи на внешние проекты.Это то, что видят клиенты (пользователи).

Сервисы похожи на внутренние проекты.Для одного внешнего проекта может быть несколько внутренних проектов или вообще нет.

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

Основной потокэто как босс в компании

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

Потоки похожи на сотрудников компании.

Чем больше у вас есть, тем больше вы можете делать одновременно, если у вас достаточно оборудования (скорость процессора)для всех них.

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

6 голосов
/ 11 ноября 2013

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

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

Таким образом, когда вы запускаете Службу, вы говорите системе что-то вроде: «Привет. У меня тут какие-то дела, не убивайте меня, пока я не закончу, пожалуйста». и Android обратите внимание на ваш запрос.

5 голосов
/ 16 марта 2012

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

Служба предназначена для использования не в GUIпрограммы.

В основном: Сервис - это нечто более независимое, чем поток.Сервис это нечто более долговечное, чем нить.Служба - это нечто более сложное, чем поток.

Кстати, потоки не работают только в фоновом режиме.То, что работает на переднем плане, тоже поток.

4 голосов
/ 16 марта 2012

Услуги больше похожи на безголовую деятельность.

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

http://developer.android.com/reference/android/app/Service.html#WhatIsAService

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

Используйте Just Thread в своей Activity, когда вам нужно выгрузить работу из потока UI, когда приложение находится на переднем плане, но эта работа может прекратиться, когда вы больше не на переднем плане. (Возможно, что ваше приложение будет продолжать работать, когда оно не на переднем плане, но нет гарантии в зависимости от ряда факторов) Вообще говоря, Android может убить вашу активность, если она не находится на переднем плане, и если процесс вашего приложения имеет никакая деятельность или услуги не могут быть убиты.

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

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

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

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

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

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

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

1 голос
/ 16 марта 2012

Android Service не запускается в отдельном процессе (по умолчанию) и даже не запускается в отдельном потоке!Он запускается в основном потоке (потоке пользовательского интерфейса) приложения, поэтому, если вы хотите выполнить какое-то трудоемкое задание в Service, запустите отдельный поток самостоятельно или используйте IntentService.

0 голосов
/ 16 марта 2019

Почему нам нужен сервис, чтобы избежать перегрузки ресурсов.Например, вы открываете приложение после открытия другого приложения, чтобы в момент добавления вашего приложения в фоновую задачу.При открытии нескольких приложений ур приложение может быть убито системой Android.Поэтому, если у вашего приложения есть служба, она не будет уничтожена системой, потому что служба имеет более высокий приоритет, даже если приложение может убить службу, так что мы используем постоянный тип возврата в onStartCommand().Метод.Это START_STICKY,START_NOT_STICKY и DELIVER_INTENT.

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