Почему я должен использовать службу android вместо java-потока - программирование
Подтвердить что ты не робот

Почему я должен использовать службу android вместо java-потока

Я запутался в сервисах android и java-потоке.

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

В соответствии с моим пониманием

Обслуживание выполняется в фоновом режиме, так что выполняйте поток.

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

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

4b9b3361

Ответ 1

Позвольте мне дать аналогию.

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

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

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

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

Главная тема похожа на босса в компании

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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

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

Ответ 4

Сервисы более похожи на беззаботную деятельность.

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

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

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

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

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

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

Ответ 5

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

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

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

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

Ответ 6

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