Background Service — istifadəçi interfeysi olmadan fon rejimində uzunmüddətli əməliyyatları yerinə yetirmək üçün nəzərdə tutulmuş Android komponentidir. Activity-dən fərqli olaraq, Service tətbiq bağlansa və ya istifadəçi başqa tətbiqə keçsə belə işləməyə davam edir. Android Developers, 2026 məlumatlarına görə, üç növ servis mövcuddur: Started Service, Bound Service və Foreground Service, hər birinin öz həyat dövriü və tətbiq sahəsi var.
Başlıca
Background Service (və ya sadəcə Service) — Activity, BroadcastReceiver və ContentProvider ilə yanaşı Android tətbiqinin dörd əsas komponentindən biridir. Activity-dən fərqli olaraq, Service görünüş interfeysinə malik deyil və tətbiqin ön planda olub-olmamasından asılı olmayaraq davam etdirilməli olan əməliyyatları yerinə yetirmək üçün nəzərdə tutulub.
Service tətbiqin əsas thread-ində (main thread) işləyir, ona görə də onun daxilindəki istənilən bloklama əməliyyatı ayrıca thread-in yaradılmasını tələb edir. Bu edilməzsə, sistem ANR (Application Not Responding) xətasını çağıracaq. Sadə fon əməliyyatları üçün Android IntentService təqdim edir, o avtomatik olaraq işçi thread yaradır. Müasir layihələrdə əsas thread-i bloklamadan asinxron emal üçün Service daxilində CoroutineScope ilə Kotlin korutinlərindən istifadə etmək tövsiyə olunur.
Service-in əsas məqsədi — musiqi oxutma, fayl yükləmə, şəbəkə sorğuları ilə işləmə, məlumat sinxronizasiyası və istifadəçinin tətbiqdən çıxmasından sonra davam etdirilməli olan digər tapşırıqlar. Lakin Android 8-in buraxılması ilə tərtibatçılar fon işinin məhdudiyyətlərini nəzərə alaraq servis növləri arasında şüurlı seçim etməlidirlər.
Service özünə məxsus həyat dövriünə malikdir ki, bu da Activity-dən fərqlənir. O, dörd əsas metodu əhatə edir: onCreate, onStartCommand, onBind və onDestroy. Bu dövrün başa düşülməsi yaddaş sızıntıları olmadan fon tapşırıqlarının düzgün həyata keçirilməsi üçün zəruridir.
onCreate metodu servis yaradıldıqda, onun ömrü boyu bir dəfə çağırılır. Burada resurslar başladılır: taymerlər, verilənlər bazasına qoşulmalar, socket-lər. onStartCommand metodu hər dəfə startService çağırıldıqda işə düşür ki, bu da artıq işləyən servisə əmrlər ötürməyə imkan verir. Qaytarılan dəyər sistemin yenidən başladılmada davranışını müəyyən edir.
class DownloadService : Service() {
override fun onCreate() {
super.onCreate()
initializeDownloader()
}
override fun onStartCommand(
intent: Intent?,
flags: Int,
startId: Int
): Int {
downloadFile(intent?.getStringExtra("url"))
return START_STICKY
}
override fun onBind(intent: Intent): IBinder? = null
}
onBind bindService vasitəsilə servis bağlandıqda çağırılır və müştəri ilə qarşılıqlı əlaqə üçün IBinder obyekti qaytarır. Bu metod yalnız Bound Service üçün istifadə olunur. onDestroy — servisin məhv edilməsindən əvvəl son çağırışdır. Burada bütün resurslar azad edilir, dayandırılmış thread-lər və ləğv edilmiş tapşırıqlar təmizlənir.
Android üç növ Service təklif edir, hər biri öz ssenarisi üçün nəzərdə tutulub. Səhv növün seçilməsi tətbiqin qeyri-sabit işinə və ya batareyanın sürətlə boşalmasına səbəb ola bilər.
Started Service startService çağırışı ilə işə salınır və stopSelf və ya stopService çağırılana qədər işləyir. O, dərhal yerinə yetirilməli olan tapşırıqlar üçün uyğundur: analitika göndərmə, şəkil emalı, tək faylın yüklənməsi. İş tamamlandıqdan sonra servis özü dayanır.
Bound Service müştəri-server interfeysi təmin edərək Activity, Fragment və ya digər komponentə servislə qarşılıqlı əlaqəyə imkan verir. Servis ən azı bir bağlı müştəri olduğu müddət yaşayır. Bütün müştərilər ayrıldıqda servis məhv edilir. Bound Service ikitərəfli əlaqə tələb edən tapşırıqlar üçün əlverişlidir: musiqi pleyeri, naviqasiya.
Foreground Service — status bar-ında daimi bildirişi olan Started Service-dir. Sistem belə bir servisi aktiv hesab edir və yaddaş çatışmazlığı olsa belə onu öldürmür. Foreground Service musiqi oxutma, audio yazma, yer müyyənləşdirmə və istifadəçi üçün əhəmiyyətli digər tapşırıqlar üçün məcburidir.
| Parametr | Started | Bound | Foreground |
|---|---|---|---|
| İşə salma | startService | bindService | startForeground |
| Ömür | stopSelfə qədər | müştərilər var | stopForegroundə qədər |
| Bildiriş | yox | yox | məcburi |
| Öldürülür | bəli | bəli | xeyr |
| Nümunə | yükləmə | pleyer | musiqi |
Yaradılma Service-dən vəris alan sinfin elan edilməsi və onun AndroidManifest.xml-də qeydiyyatdan keçirilməsi ilə başlayır. Manifestdə qeydiyyat olmadan sistem servisi işə sala bilməz və hər hansı startService çağırışı istisnaya səbəb olacaq.
// AndroidManifest.xml-də qeydiyyat
@SuppressLint("ForegroundServiceType")
class SyncService : Service() {
override fun onStartCommand(
intent: Intent?,
flags: Int,
startId: Int
): Int {
startForeground(
NOTIFICATION_ID,
createNotification()
)
performSync(intent)
return START_NOT_STICKY
}
}
Servisi Activity və ya Fragment-dən işə salmaq üçün servis sinfinin açıq göstərildiyi Intent istifadə olunur. Android 8-dən etibarən Foreground Service üçün manifestdə FOREGROUND_SERVICE icazəsi tələb olunur.
// Started Service-in işə salınması
val intent = Intent(this, SyncService::class.java)
intent.putExtra("action", "sync")
startService(intent)
// Foreground Service-in işə salınması (Android 8+)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
startForegroundService(intent)
} else {
startService(intent)
}
Android 8-dən (API 26) etibarən Google fon servislərinə ciddi məhdudiyyətlər tətbiq edib. Fon rejimində Service işə salma (tətbiq ön planda olmadıqda) yalnız istisna hallarda icazəlidir: push bildirişi alındıqda, cihaz yükləndikdən sonra və ya JobScheduler vasitəsilə.
Dərhal yerinə yetirilməsi tələb olunmayan uzunmüddətli tapşırıqlar üçün WorkManager və ya JobScheduler istifadə etmək tövsiyə olunur. Əgər tətbiq həqiqətən də işləyən servisə ehtiyac duyursa, yeganə yol — istifadəçinin gördüyü bildirişlə Foreground Service-dir. Bildirişsiz fon servisinin işə salınması sistem tərəfindən nəzərdən qaçırılacaq.
JobIntentService — Android 5+-də işləmək üçün support kitabxanasında peyda olan ixtisaslaşdırılmış sinifdir. O, IntentService-in davranışını (avtomatik işçi thread, ardıcıl emal) JobScheduler vasitəsilə planlaşdırma ilə birləşdirir. Android 8+-da JobIntentService JobScheduler-dən istifadə edir, köhnə versiyalarda isə adi Service-dən. Bu, Android versiyasını əlavə yoxlamadan fon tapşırıqlarını vahid şəkildə idarə etməyə imkan verir.
class UploadJobService : JobIntentService() {
companion object {
private const val JOB_ID = 1000
fun enqueueWork(context: Context, work: Intent) {
enqueueWork(
context,
UploadJobService::class.java,
JOB_ID,
work
)
}
}
override fun onHandleWork(intent: Intent) {
val fileUri = intent.getStringExtra("file_uri")
// Fon thread-də icra olunur
uploadFile(fileUri)
}
}
Background Service ilə işləyərkən tez-tez rast gəlinən problemlərdən biri yaddaş sızıntılarıdır. Service Activity-dən daha uzun yaşaya bildiyi üçün, Service daxilində Activity-yə istinadlar (listener, callback və ya broadcast vasitəsilə) UI komponentlərinin zibil yığıcı tərəfindən təmizlənməməsinə səbəb olur. Service ilə UI arasında əlaqə üçün WeakReference, ViewModel və ya LiveData istifadə etmək tövsiyə olunur. onDestroy-də bütün abunəliklər ləğv edilməli, thread-lər dayandırılmalı və kursorlar bağlanmalıdır.
Background Service ilə WorkManager arasında seçim ssenaridən asılıdır. Service dərhal və fasiləsiz yerinə yetirilməli olan tapşırıqlar üçün uyğundur: musiqi oxutma, audio yazma, GPS izləmə. WorkManager təxirə salınmış, zəmanətli tapşırıqlar üçün daha yaxşıdır: sinxronizasiya, analitika göndərmə, logların yüklənməsi. WorkManager cihazın yenidən başlamasından sağ çıxır, Service isə çıxmır. Service bildirişlə Foreground ola bilər, WorkManager isə səssizcə fonda işləyir. Təcrübədə tərtibatçılar hər iki yanaşmanı birləşdirirlər: kritik istifadəçi tapşırıqları üçün Foreground Service və fon xidməti üçün WorkManager.
Android 12 android:foregroundServiceType flag-ını təqdim etdi ki, bu da xidmət növünü təyin etməyi tələb edir: dataSync, camera, connectedDevice, location, mediaPlayback və başqaları. Növün səhv göstərilməsi işə salma zamanı istisnaya səbəb olur. Bu təcrübə Background Service-i istifadəçi və sistem üçün daha şəffaf edir.
Manifestdə Service-in düzgün qeydiyyatı exported (xarici tətbiqlər üçün çatışlılıq), foregroundServiceType (Android 12+-da fon xidmət növü) və permission atributlarını əhatə edir. Bound Service üçün JobIntentService üçün android:permission="android.permission.BIND_JOB_SERVICE" elan edilməlidir. Manifestdə qeydiyyat olmadan hər hansı startService və ya bindService çağırışı istisna ilə nəticələnəcək, buna görə də manifestin yoxlanması Service ilə bağlı problemlərin diaqnostikasında ilk addımdır.
Tez-tez verilən suallar
Service tətbiqin əsas thread-ində (UI Thread) işləyir. onStartCommand və ya onHandleIntent daxilindəki istənilən bloklama əməliyyatı ayrıca threadə və ya korutinə köçürülməlidir, əks halda sistem 5 saniyədən sonra ANR çağıracaq.
IntentService — avtomatik olaraq işçi thread yaradan və əmrləri ardıcıl emal edən Service varisidir. Son tapşırığı tamamladıqdan sonra IntentService özü dayanır. Android 8-dən etibarən IntentService JobIntentService və ya WorkManager lehinə köhnəlmiş sayılır.
Android 12-də fondan Started Service işə salmaq qadağandır. İstisna — manifestdə elan edilmiş foregroundServiceType və etibarlı bildirişi olan Foreground Service. Həmçinin yüksək prioritetli FCM mesajı alındıqdan sonra qısa müddətli başlatmaya icazə verilir.
Üç üsul var: lokal broadcast ilə BroadcastReceiver, Handler vasitəsilə Messenger mexanizmi və MVVM arxitekturasında ümumi ViewModel ilə LiveData/Flow. Bound Service üçün metodların birbaşa çağırılması ilə IBinder istifadə olunur.
Əgər Service START_STICKY flag-ı ilə işə salınıbsa, sistem yaddaş çatışmazlığı səbəbindən proses məhv edildikdən sonra onu yenidən başladacaq. START_NOT_STICKY flag-ı sistemin servisi yenidən başlatmayacağını bildirir. START_REDELIVER_INTENT START_STICKY-ə bənzəyir, lakin son Intent-i ötürür.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun