Background Service — Android komponenti bo‘lib, foydalanuvchi interfeysisiz fon rejimida uzoq muddatli operatsiyalarni bajarish üçün mo‘ljallangan. Activity-dan farqli o‘laroq, Service ilova kichraytirilgan yoki foydalanuvchi boshqa ilovaga o‘tgan taqdirda ham ishlashda davom etadi. Android Developers, 2026 ma’lumotlariga ko‘ra, uch turdagi servis mavjud: Started Service, Bound Service va Foreground Service, har biri o‘z hayot sikli va qo‘llanish sohasiga ega.
Asosiy
Background Service (yoki oddiygina Service) — Activity, BroadcastReceiver va ContentProvider bilan bir qatorda Android ilovasining to‘rtta asosiy komponentidan biridir. Activity-dan farqli o‘laroq, Service vizual interfeysga ega emas va ilova oldingi planda yoki yo‘qligidan qat’i nazar davom ettirilishi kerak bo‘lgan operatsiyalarni bajarish üçün mo‘ljallangan.
Service ilovaning asosiy oqimida (main thread) ishlaydi, shuning üçün uning ichidagi har qanday blokirovka operatsiyasi alohida oqim yaratishni talab qiladi. Agar bu bajarilmasa, tizim ANR (Application Not Responding) chaqiradi. Oddiy fon operatsiyalari üçün Android IntentService ni taqdim etadi, u avtomatik ravishda ishchi oqim yaratadi. Zamonaviy loyihalarda asosiy oqimni bloklamasdan asinxron qayta ishlash üçün Service ichida CoroutineScope bilan Kotlin korutinlaridan foydalanish tavsiya etiladi.
Service-ning asosiy maqsadi — musiqa tinglash, fayllarni yuklash, tarmoq so‘rovlari bilan ishlash, ma’lumotlarni sinxronlashtirish va foydalanuvchi ilovani tark etgandan keyin davom ettirilishi kerak bo‘lgan boshqa vazifalar. Biroq Android 8 chiqishi bilan dasturchilar fon ishining cheklovlarini hisobga olgan holda servis turlari o‘rtasida ongli ravishda tanlov qilishlari kerak.
Service o‘ziga xos hayot siklga ega bo‘lib, u Activity-dan farq qiladi. U to‘rtta asosiy metodni o‘z ichiga oladi: onCreate, onStartCommand, onBind va onDestroy. Ushbu siklning tushunilishi xotira oqishisiz fon vazifalarini to‘g‘ri amalga oshirish üçün zarurdir.
onCreate metodi servis yaratilganda, uning hayoti davomida bir marta chaqiriladi. Unda resurslar ishga tushiriladi: taymerlar, ma’lumotlar bazasiga ulanishlar, soketlar. onStartCommand metodi har safar startService chaqirilganda ishga tushadi, bu allaqachon ishlayotgan servisga buyruqlarni uzatish imkonini beradi. Qaytarilgan qiymat tizimning qayta ishga tushirishdagi xatti-harakatini aniqlaydi.
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 orqali servis bog‘langanda chaqiriladi va mijoz bilan o‘zaro aloqa üçün IBinder obyektini qaytaradi. Bu metod faqat Bound Service üçün ishlatiladi. onDestroy — servis yo‘q qilinishidan oldingi so‘nggi chaqiruvdir. Unda barcha resurslar bo‘shatiladi, to‘xtatilgan oqimlar va bekor qilingan vazifalar tozalanadi.
Android uch turdagi Service ni taklif qiladi, har biri o‘z stsenariysi üçün mo‘ljallangan. Noto‘g‘ri turni tanlash ilovaning beqaror ishlashiga yoki batareyaning tez sarflanishiga olib kelishi mumkin.
Started Service startService chaqiruvi bilan ishga tushiriladi va stopSelf yoki stopService chaqirilgunga qadar ishlaydi. U darhol bajarilishi kerak bo‘lgan vazifalar üçün mos keladi: analitika yuborish, rasmni qayta ishlash, bitta faylni yuklash. Ish tugagandan so‘ng servis o‘zini o‘zi to‘xtatadi.
Bound Service mijoz-server interfeysini taqdim etadi, bu Activity, Fragment yoki boshqa komponentga servis bilan o‘zaro aloqa qilish imkonini beradi. Servis kamida bitta bog‘langan mijoz mavjud ekan, yashaydi. Barcha mijozlar uzilganda servis yo‘q qilinadi. Bound Service ikki tomonlama aloqa talab qiladigan vazifalar üçün qulaydir: musiqa pleyeri, navigatsiya.
Foreground Service — status barda doimiy bildirishnomaga ega Started Service. Tizim bunday servisni faol deb hisoblaydi va xotira yetishmovchiligi bo‘lsa ham uni o‘ldirmaydi. Foreground Service musiqa tinglash, audio yozish, joylashuvni kuzatish va foydalanuvchi üçün muhim bo‘lgan boshqa vazifalar üçün majburiydir.
| Parametr | Started | Bound | Foreground |
|---|---|---|---|
| Ishga tushirish | startService | bindService | startForeground |
| Hayot | stopSelfgacha | mijozlar bor | stopForegroundgacha |
| Bildirishnoma | yo‘q | yo‘q | majburiy |
| O‘ldiriladi | ha | ha | yo‘q |
| Misol | yuklash | pleyer | musiqa |
Yaratish Service dan meros olgan sinfni e‘lon qilish va uni AndroidManifest.xml da ro‘yxatdan o‘tkazish bilan boshlanadi. Manifestda ro‘yxatdan o‘tmasdan tizim servisni ishga tushira olmaydi va har qanday startService chaqiruvi istisnoga olib keladi.
// AndroidManifest.xml da ro‘yxatdan o‘tkazish
@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
}
}
Servisni Activity yoki Fragment dan ishga tushirish üçün servis sinfining aniq ko‘rsatilgan Intent dan foydalaniladi. Android 8 dan boshlab Foreground Service üçün manifestda FOREGROUND_SERVICE ruxsati talab qilinadi.
// Started Service ni ishga tushirish
val intent = Intent(this, SyncService::class.java)
intent.putExtra("action", "sync")
startService(intent)
// Foreground Service ni ishga tushirish (Android 8+)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
startForegroundService(intent)
} else {
startService(intent)
}
Android 8 dan (API 26) boshlab Google fon servislariga qattiq cheklovlar joriy qildi. Service ni fonda ishga tushirish (ilova oldingi planda bo‘lmaganda) faqat istisno hollarda ruxsat etiladi: push bildirishnomasi olinganda, qurilma yuklangandan so‘ng yoki JobScheduler orqali.
Darhol bajarilishni talab qilmaydigan uzoq muddatli vazifalar üçün WorkManager yoki JobScheduler dan foydalanish tavsiya etiladi. Agar ilova haqiqatan ham ishlayotgan servisga muhtoj bo‘lsa, yagona yo‘l — foydalanuvchi ko‘radigan bildirishnoma bilan Foreground Service. Fonda bildirishnomasiz servisni ishga tushirish tizim tomonidan e‘tiborga olinmaydi.
JobIntentService — Android 5+ da ishlash üçün support library da paydo bo‘lgan ixtisoslashtirilgan sinf. U IntentService ning xatti-harakatini (avtomatik ishchi oqim, ketma-ket qayta ishlash) JobScheduler orqali rejalashtirish bilan birlashtiradi. Android 8+ da JobIntentService JobScheduler dan foydalanadi, eski versiyalarda esa oddiy Service dan. Bu Android versiyasini qo‘shimcha tekshirmasdan fon vazifalarini bir xilda boshqarish imkonini beradi.
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 oqimida bajariladi
uploadFile(fileUri)
}
}
Background Service bilan ishlashda tez-tez uchraydigan muammolardan biri xotira oqishidir. Service Activity dan uzoqroq yashashi mumkinligi sababli, Service ichidagi Activity ga havolalar (listener, callback yoki broadcast orqali) UI komponentlari üçün axlat yig‘uvchining tozalanmasligiga olib keladi. Service ni UI bilan bog‘lash üçün WeakReference, ViewModel yoki LiveData dan foydalanish tavsiya etiladi. onDestroy da barcha obunalar bekor qilinishi, oqimlar to‘xtatilishi va kursorlar yopilishi kerak.
Background Service va WorkManager o‘rtasidagi tanlov stsenariyga bog‘liq. Service darhol va uzluksiz bajarilishi kerak bo‘lgan vazifalar üçün mos keladi: musiqa tinglash, audio yozish, GPS kuzatish. WorkManager kechiktirilgan, kafolatlangan vazifalar üçün yaxshiroq: sinxronlashtirish, analitika yuborish, loglarni yuklash. WorkManager qurilmaning qayta ishga tushishidan omon qoladi, Service esa yo‘q. Service bildirishnoma bilan Foreground bo‘lishi mumkin, WorkManager esa fonda jim ishlaydi. Amalda dasturchilar ikkala yondashuvni birlashtiradilar: kritik foydalanuvchi vazifalari üçün Foreground Service va fon xizmati üçün WorkManager.
Android 12 android:foregroundServiceType flagini taqdim etdi, u xizmat turini ko‘rsatishni talab qiladi: dataSync, camera, connectedDevice, location, mediaPlayback va boshqalar. Turini noto‘g‘ri ko‘rsatish ishga tushirishda istisnoga olib keladi. Bu amaliyot Background Service ni foydalanuvchi va tizim üçün shaffofroq qiladi.
Manifestda Service ni to‘g‘ri ro‘yxatdan o‘tkazish exported (tashqi ilovalar üçün mavjudlik), foregroundServiceType (Android 12+ da fon xizmat turi) va permission atributlarini o‘z ichiga oladi. Bound Service üçün JobIntentService üçün android:permission="android.permission.BIND_JOB_SERVICE" e‘lon qilinishi kerak. Manifestda ro‘yxatdan o‘tmasdan, har qanday startService yoki bindService chaqiruvi istisno bilan tugaydi, shuning üçün manifestni tekshirish Service bilan bog‘liq muammolarni tashxislashda birinchi qadamdir.
Tez-tez beriladigan savollar
Service ilovaning asosiy oqimida (UI Thread) ishlaydi. onStartCommand yoki onHandleIntent ichidagi har qanday blokirovka operatsiyasi alohida oqimga yoki korutinga ko‘chirilishi kerak, aks holda tizim 5 soniyadan so‘ng ANR chaqiradi.
IntentService — avtomatik ravishda ishchi oqim yaratadigan va buyruqlarni ketma-ket qayta ishlaydigan Service vorisidir. Oxirgi vazifa tugagandan so‘ng IntentService o‘zini o‘zi to‘xtatadi. Android 8 dan boshlab IntentService JobIntentService yoki WorkManager foydasiga eskirgan hisoblanadi.
Android 12 da fondan Started Service ni ishga tushirish taqiqlangan. Istisno — manifestda e‘lon qilingan foregroundServiceType va haqiqiy bildirishnomaga ega Foreground Service. Shuningdek, yuqori prioritetli FCM xabari olingandan so‘ng qisqa muddatli ishga tushirishga ruxsat beriladi.
Uchta usul mavjud: lokal broadcast bilan BroadcastReceiver, Handler orqali Messenger mexanizmi va MVVM arxitekturasida umumiy ViewModel bilan LiveData/Flow. Bound Service üçün metodlarni to‘g‘ridan-to‘g‘ri chaqirish bilan IBinder ishlatiladi.
Agar Service START_STICKY flagi bilan ishga tushirilgan bo‘lsa, tizim xotira yetishmovchiligi sababli jarayon yo‘q qilingandan so‘ng uni qayta ishga tushiradi. START_NOT_STICKY flagi tizim servisni qayta ishga tushirmasligini bildiradi. START_REDELIVER_INTENT START_STICKY ga o‘xshaydi, ammo oxirgi Intent ni uzatadi.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.