Service е компонент в Android, който може да извършва работа, без да има собствен потребителски интерфейс, като възпроизвеждане на музика, синхронизиране на данни или текущо прехвърляне на файл. Заедно с activities, broadcast receivers и content providers services са един от четирите основни компонента на приложенията в Android и подобно на останалите трябва да бъдат регистрирани в AndroidManifest.xml на приложението. По подразбиране service работи в основната нишка на приложението, така че тежката работа все пак трябва да бъде преместена във фонова нишка.
Android разграничава стартираните services, които изпълняват задача, докато не бъдат спрени, и свързаните services, към които други компоненти могат да се свържат и да комуникират с тях. Service на преден план извършва работа, за която потребителят знае, и трябва да показва постоянно известие. Тъй като фоновата работа влияе на живота на батерията и на производителността, Android постепенно въведе ограничения за това кога приложенията могат да стартират services във фонов режим, а за отлаганата работа Google обикновено препоръчва вместо това WorkManager.
Service в Android е компонент на приложението, който извършва работа без собствен потребителски интерфейс, като възпроизвеждане на музика, синхронизиране или прехвърляне на файлове. Той може да бъде стартиран, за да изпълни задача, или към него могат да се свържат други компоненти, които искат да комуникират с него. Services на преден план показват постоянно известие, така че потребителят да знае, че работата се извършва, а поради ограниченията на Android за фоновата работа за отлаганите задачи често се използва WorkManager.
More about Service
Service е един от четирите основни компонента на едно Android приложение заедно с activities, broadcast receivers и content providers. Докато activity показва екран, с който потребителят взаимодейства, service се използва за работа, която не изисква потребителски интерфейс или трябва да продължи дори ако потребителят напусне екрана. Типични примери са възпроизвеждането на музика или подкасти, навигацията, качването на файлове и синхронизирането на данни със сървър.
Технически service е клас, който наследява android.app.Service и се регистрира с елемент service в AndroidManifest.xml. Системата контролира жизнения цикъл на service чрез методи като onCreate(), onStartCommand(), onBind() и onDestroy(). Важно е да се знае, че service не работи автоматично в отделна нишка. По подразбиране кодът му се изпълнява в основната нишка на приложението, така че продължителната или блокиращата работа трябва да бъде преместена във фонова нишка, например с Kotlin coroutines, за да се предотврати приложението да спре да реагира.
Services могат да се използват по различни начини, всеки от които е подходящ за различни нужди:
Service на преден план: Извършва работа, за която потребителят знае, като възпроизвеждане на музика или активно проследяване на тренировка. Service на преден план трябва да показва постоянно известие, а в по-новите версии на Android приложението трябва да декларира тип на service и да притежава свързаните с него права за достъп.
Фонов service: Извършва работа, която потребителят не вижда пряко. От Android 8.0 насам има строги ограничения за това кога приложенията могат да стартират такива services, докато самите те са във фонов режим.
Свързан service: Предлага клиент-сървър интерфейс, при който други компоненти, включително такива в други приложения, могат да се свържат към service, да изпращат заявки и да получават отговори. Свързаният service съществува, докато поне един компонент е свързан към него.
Една от най-големите силни страни на services е, че позволяват на приложението да продължи важна работа, без тя да е обвързана с определен екран. Същевременно те изискват внимание, защото работата във фонов режим използва батерия, памет и данни. Затова Android постепенно въведе правила, които ограничават фоновата работа, а потребителите могат да виждат и да спират приложенията, които изпълняват services на преден план.
За много задачи Google препоръчва вместо това WorkManager, който е част от Android Jetpack. WorkManager е предназначен за работа, която трябва да бъде изпълнена надеждно, дори ако приложението бъде затворено или устройството бъде рестартирано, и която може да бъде отложена, като качване на лог файлове или периодично синхронизиране. WorkManager отчита ограниченията на системата и може да се конфигурира с условия като мрежова връзка или зареждане.
В обобщение, service е правилният избор, когато едно приложение трябва да извършва текуща работа, за която потребителят очаква да продължи, или когато други компоненти трябва да комуникират с продължителен процес. Като избират правилния тип service или WorkManager, когато работата може да бъде отложена, разработчиците могат да създават приложения, които са едновременно функционални и щадящи ресурсите на устройството.
Frequently asked questions about Service
Какво е service в Android?
Service е компонент в Android, който извършва работа във фонов режим, без да има собствен потребителски интерфейс. Използва се за задачи, които трябва да продължат дори когато потребителят не гледа приложението, като възпроизвеждане на музика, текуща навигация или качване на файлове.
Service трябва да бъде деклариран във файла AndroidManifest.xml. Важно е да се знае, че по подразбиране service работи в основната нишка на приложението. Затова тежките задачи все пак трябва да бъдат преместени във фонова нишка или в coroutine. В по-новите версии на Android има и строги правила за това кога приложенията могат да работят във фонов режим, за да се пести батерия.
Какви типове service има в Android?
Android разграничава три типа service. Service на преден план изпълнява задача, за която потребителят знае, и трябва да показва известие, докато работи. Използва се например за възпроизвеждане на музика или проследяване на бягане.
Фоновият service извършва работа, която потребителят не вижда пряко. От Android 8.0 насам има строги ограничения за това кога приложенията могат да стартират такива services, а за много задачи вместо това се препоръчва WorkManager. Свързаният service позволява на други компоненти, като activity, да се свържат към него и да комуникират с него, и работи само докато нещо е свързано към него.
Каква е разликата между стартиран service и свързан service?
Стартираният service се стартира с startService или startForegroundService и работи, докато не спре сам или не бъде спрян. Обикновено той изпълнява конкретна задача и не връща резултат директно на компонента, който го е стартирал.
Свързаният service се стартира, когато друг компонент се свърже към него с bindService. Той предоставя интерфейс, така че компонентът да може да извиква методи и да получава отговори, например activity, която управлява музикален плейър. Когато вече няма свързани компоненти, той се спира. Един service може да бъде и двете едновременно, ако е едновременно стартиран и свързан.
Кога трябва да се използва WorkManager вместо service?
WorkManager е препоръчаното от Google решение за фонова работа, която трябва да се изпълни надеждно, дори ако приложението бъде затворено или устройството бъде рестартирано. Това може да бъде синхронизиране на данни, качване на лог файлове или периодично почистване.
WorkManager спазва правилата на системата за батерията и фоновата активност и може да бъде настроен да работи само когато например устройството е свързано към Wi-Fi или се зарежда. Service, особено service на преден план, е по-подходящ, когато работата трябва да се извърши веднага и е видима за потребителя, като възпроизвеждане на музика или текущо обаждане. За краткотрайна работа, докато приложението е отворено, често са достатъчни coroutines.
Защо service на преден план трябва да показва известие?
Service на преден план може да работи дълго време и да използва ресурси като процесора, батерията и данните за местоположение, докато потребителят няма отворено приложението. Затова Android изисква той да показва постоянно известие, така че потребителят да знае, че приложението работи във фонов режим.
Това осигурява прозрачност и позволява на потребителя да спре service или да отвори приложението. В по-новите версии на Android разработчиците трябва също да декларират тип на service, като възпроизвеждане на медийно съдържание, местоположение или синхронизиране на данни, и да притежават свързаните с него права за достъп. От Android 13 потребителят трябва и да даде разрешение за известията, което влияе на начина, по който се показва известието.
Какви ограничения налага Android върху фоновата работа?
За да пести батерия и да защитава поверителността на потребителя, Android постепенно въведе ограничения за фоновата работа. От Android 8.0 насам приложенията във фонов режим по принцип не могат да стартират обикновени фонови services, а системата ги спира след кратко време.
Режимът Doze и App Standby отлагат мрежовия достъп и задачите, когато устройството не се използва или приложението се използва рядко. По-новите версии изискват типове и права за достъп за services на преден план и ограничават кога те могат да бъдат стартирани от фонов режим. Достъпът до местоположението във фонов режим изисква отделно право за достъп. Затова фоновата работа трябва да се планира с WorkManager, когато това е възможно.
Service for dummies
Service в Android приложение е своеобразен невидим помощник, който може да продължи да работи дори когато никой не гледа приложението. Представете си музикално приложение: може да се пусне песен, потребителят може да се върне на началния екран и да напише съобщение, а музиката продължава да свири. За това се грижи service. Когато едно приложение използва service за нещо, за което потребителят трябва да знае, телефонът показва малко известие, така че да е ясно, че приложението работи. Същевременно Android следи приложенията да не използват твърде много енергия във фонов режим, така че батерията да издържа по-дълго.