Background Service, kullanıcı arayüzü olmadan arka planda uzun süreli işlemler gerçekleştirmek üzere tasarlanmış bir Android bileşenidir. Activity’nin aksine, Service uygulama küçültüldüğünde veya kullanıcı başka bir uygulamaya geçtiğinde bile çalışmaya devam eder. Android Developers, 2026’ya göre, üç tür hizmet vardır: Started Service, Bound Service ve Foreground Service, her biri kendi yaşam döngüsü ve uygulama alanına sahiptir.
Önemli Noktalar
Background Service (veya kısaca Service), Activity, BroadcastReceiver ve ContentProvider ile birlikte bir Android uygulamasının dört temel bileşeninden biridir. Activity’nin aksine, Service görsel bir arayüze sahip değildir ve uygulamanın ön planda olup olmadığına bakılmaksızın devam etmesi gereken işlemleri gerçekleştirmek üzere tasarlanmıştır.
Service, uygulamanın ana iş parçacığında çalışır, bu nedenle içindeki herhangi bir bloke edici işlem ayrı bir iş parçacığı oluşturulmasını gerektirir. Bu yapılmazsa, sistem ANR (Application Not Responding) hatası verecektir. Basit arka plan işlemleri için Android, otomatik olarak bir çalışma iş parçacığı oluşturan IntentService’i sağlar. Modern projelerde, ana iş parçacığını bloke etmeden asenkron işlem için Service içinde CoroutineScope ile Kotlin coroutine’lerinin kullanılması önerilir.
Service’in temel amacı, müzik çalma, dosya indirme, ağ isteklerini yönetme, veri senkronizasyonu ve kullanıcının uygulamadan ayrılmasından sonra devam etmesi gereken diğer görevlerdir. Ancak Android 8’den itibaren geliştiriciler, arka plan çalışma kısıtlamalarını dikkate alarak hizmet türleri arasında bilinçli bir seçim yapmalıdır.
Service, Activity’den farklı olarak kendine özgü bir yaşam döngüsüne sahiptir. Dört temel yöntem içerir: onCreate, onStartCommand, onBind ve onDestroy. Bu döngüyü anlamak, bellek sızıntısı olmadan arka plan görevlerini doğru şekilde uygulamak için önemlidir.
onCreate yöntemi, hizmet oluşturulduğunda bir kez çağrılır. Zamanlayıcılar, veritabanı bağlantıları ve soketler gibi kaynaklar burada başlatılır. onStartCommand yöntemi, startService her çağrıldığında çağrılır ve halihazırda çalışan bir hizmete komut gönderilmesine olanak tanır. Dönüş değeri, yeniden başlatma sırasında sistem davranışını belirler.
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, bir hizmetin bindService aracılığıyla bağlanması sırasında çağrılır ve istemci etkileşimi için bir IBinder nesnesi döndürür. Bu yöntem yalnızca Bound Service için kullanılır. onDestroy, hizmet yok edilmeden önceki son çağrıdır. Tüm kaynaklar serbest bırakılır, iş parçacıkları durdurulur ve görevler iptal edilir.
Android, her biri kendi senaryosu için tasarlanmış üç tür Service sunar. Yanlış türü seçmek, uygulamanın dengesiz davranmasına veya pil tüketimine neden olabilir.
Started Service, startService çağrılarak başlatılır ve stopSelf veya stopService çağırana kadar çalışır. Hemen gerçekleştirilmesi gereken görevler için uygundur: analitik gönderme, bir görüntüyü işleme, tek bir dosya indirme. İşini tamamladıktan sonra hizmet kendi kendine durur.
Bound Service, bir istemci-sunucu arabirimi sağlayarak bir Activity, Fragment veya başka bir bileşenin hizmetle etkileşime girmesine olanak tanır. Hizmet, en az bir istemci bağlı olduğu sürece yaşar. Tüm istemcilerin bağlantısı kesildiğinde hizmet yok edilir. Bound Service, çift yönlü iletişim gerektiren görevler için kullanışlıdır: müzik çalar, navigasyon.
Foreground Service, durum çubuğunda kalıcı bir bildirimi olan bir Started Service’dir. Sistem böyle bir hizmeti aktif olarak kabul eder ve düşük bellek durumunda bile onu öldürmez. Foreground Service, müzik çalma, ses kaydı, konum takibi ve kullanıcı için önemli diğer görevler için zorunludur.
| Parametre | Started | Bound | Foreground |
|---|---|---|---|
| Başlatma | startService | bindService | startForeground |
| Ömür | stopSelf’e kadar | istemciler olduğu sürece | stopForeground’a kadar |
| Bildirim | hayır | hayır | zorunlu |
| Öldürülebilir | evet | evet | hayır |
| Örnek | indirme | çalar | müzik |
Bir hizmet oluşturmak, Service’den miras alan bir sınıf bildirmek ve AndroidManifest.xml’e kaydetmekle başlar. Bildirim dosyasına kayıt olmadan sistem hizmeti başlatamaz ve startService çağrısı bir istisnaya neden olur.
// AndroidManifest.xml’e kayıt
@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
}
}
Bir Activity veya Fragment’ten hizmet başlatmak için, hizmet sınıfına açık bir başvuru içeren bir Intent kullanılır. Android 8’den itibaren Foreground Service, bildirim dosyasında FOREGROUND_SERVICE iznini gerektirir.
// Started Service başlatma
val intent = Intent(this, SyncService::class.java)
intent.putExtra("action", "sync")
startService(intent)
// Foreground Service başlatma (Android 8+)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
startForegroundService(intent)
} else {
startService(intent)
}
Android 8’den itibaren (API 26), Google arka plan hizmetleri için katı kısıtlamalar getirdi. Arka planda hizmet başlatma (uygulama ön planda değilken) yalnızca istisnai durumlarda izin verilir: push bildirimi alındığında, cihaz başlatıldıktan sonra veya JobScheduler aracılığıyla.
Hemen yürütülmesi gerekmeyen uzun süreli görevler için WorkManager veya JobScheduler kullanılması önerilir. Bir uygulamanın gerçekten çalışan bir hizmete ihtiyacı varsa, tek yol kullanıcının görebileceği bir bildirim içeren Foreground Service’dir. Arka planda bildirimsiz bir hizmet başlatmak sistem tarafından görmezden gelinecektir.
JobIntentService, Android 5+’te çalışmak üzere destek kütüphanesinde ortaya çıkan özel bir sınıftır. IntentService’in davranışını (otomatik çalışma iş parçacığı, sıralı işleme) JobScheduler aracılığıyla zamanlamayla birleştirir. Android 8+’de JobIntentService dahili olarak JobScheduler’ı kullanırken, eski sürümlerde normal bir Service kullanır. Bu, ek Android sürümü kontrolleri olmadan arka plan görevlerinin tek tip şekilde işlenmesine olanak tanır.
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")
// Bir arka plan iş parçacığında çalışır
uploadFile(fileUri)
}
}
Background Service ile çalışırken sık karşılaşılan sorunlardan biri bellek sızıntılarıdır. Bir Service bir Activity’den daha uzun yaşayabileceğinden, Service içindeki Activity’ye yapılan referanslar (listener, callback veya broadcast aracılığıyla) UI bileşenlerinin çöp toplamasını engeller. Service-UI iletişimi için WeakReference, ViewModel veya LiveData kullanılması önerilir. onDestroy’de tüm abonelikleri iptal etmeyi, iş parçacıklarını durdurmayı ve imleçleri kapatmayı unutmayın.
Background Service ve WorkManager arasındaki seçim senaryoya bağlıdır. Service, hemen ve sürekli olarak çalışması gereken görevler için uygundur: müzik çalma, ses kaydı, GPS takibi. WorkManager, ertelenmiş, garantili görevler için daha iyidir: senkronizasyon, analitik gönderme, log yükleme. WorkManager cihaz yeniden başlatmalarında hayatta kalırken, Service kalmaz. Service bildirimle ön planda olabilirken, WorkManager arka planda sessizce çalışır. Pratikte geliştiriciler her iki yaklaşımı birleştirir: kullanıcı için kritik görevlerde Foreground Service ve arka plan bakımı için WorkManager.
Android 12, hizmet türünün belirtilmesini gerektiren android:foregroundServiceType bayrağını getirdi: dataSync, camera, connectedDevice, location, mediaPlayback ve diğerleri. Yanlış tür belirtimi başlatma sırasında bir istisnaya neden olur. Bu uygulama, Background Service’i hem kullanıcı hem de sistem için daha şeffaf hale getirir.
Bildirim dosyasında Service’in doğru kaydı, exported özelliğini (harici uygulamalar için erişilebilirlik), foregroundServiceType’ı (Android 12+’de arka plan hizmet türü) ve izni içerir. Bound Service için JobIntentService için android:permission="android.permission.BIND_JOB_SERVICE" bildirilmelidir. Bildirim dosyasına kayıt olmadan herhangi bir startService veya bindService çağrısı bir istisnaya neden olur, bu nedenle Service ile ilgili sorunları teşhiste ilk adım bildirim dosyasını kontrol etmektir.
Sıkça Sorulan Sorular
Service, uygulamanın ana iş parçacığında (UI Thread) çalışır. onStartCommand veya onHandleIntent içindeki herhangi bir bloke edici işlem ayrı bir iş parçacığına veya coroutine’e taşınmalıdır, aksi takdirde sistem 5 saniye sonra ANR verir.
IntentService, otomatik olarak bir çalışma iş parçacığı oluşturan ve komutları sırayla işleyen Service’in bir alt sınıfıdır. Son görevi tamamladıktan sonra IntentService kendi kendine durur. Android 8’den itibaren IntentService, JobIntentService veya WorkManager lehine kullanımdan kaldırılmıştır.
Android 12’de arka plandan Started Service başlatmak yasaktır. İstisna, bildirim dosyasında bildirilen foregroundServiceType ve geçerli bir bildirime sahip Foreground Service’dir. Yüksek öncelikli bir FCM mesajı aldıktan sonra kısa bir başlatmaya da izin verilir.
Üç yöntem vardır: yerel yayın ile BroadcastReceiver, Handler aracılığıyla Messenger mekanizması ve paylaşılan bir ViewModel ile MVVM mimarisinde LiveData/Flow. Bound Service için, doğrudan yöntem çağrılarıyla IBinder kullanılır.
Bir Service, START_STICKY bayrağıyla başlatıldıysa, sistem düşük bellek nedeniyle işlem öldürüldükten sonra onu yeniden başlatır. START_NOT_STICKY bayrağı, sistemin hizmeti yeniden başlatmayacağı anlamına gelir. START_REDELIVER_INTENT, START_STICKY’ye benzer ancak son Intent’i iletir.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun