Foreground Service, durum çubuğunda zorunlu bildirimle kullanıcı tarafından görülebilen uzun süreli işlemleri gerçekleştiren bir Android hizmetidir. Kaynaklar yetersiz olduğunda sistemin durdurabileceği Background Service'in aksine, Foreground Service yüksek öncelik alır ve sınırlı bellek koşullarında bile çalışmaya devam eder. Android Developers, 2025 belgelerine göre, Foreground Service Android 12 ve sonrasını çalıştıran cihazlarda uzun süreli görevleri gerçekleştirmenin tek güvenilir yolu olmaya devam etmektedir.
Anahtar Noktalar
Foreground Service, kullanıcının bildiği ve görebildiği işlemleri gerçekleştirmek üzere tasarlanmış bir Android bileşenidir. Bildirim panelinde kaydırılarak kaldırılamayan kalıcı bir bildirim görüntüler — hizmet çalıştığı sürece etkin kalır. Bu, kullanıcı tarafından fark edilmeden çalışan bir arka plan hizmetinden temel farktır.
Android sistemi Foreground Service'i kritik derecede önemli bir süreç olarak görür. RAM düşük olduğunda, platform önce Background Services'i, ardından önbelleğe alınmış Activities'i ve yalnızca istisnai durumlarda — Foreground Service'i sonlandırır. OOM Killer böyle bir hizmete ADJ seviye 2 atar ve bu da zorla sonlandırılmasını pratik olarak imkansız kılar.
Bir Foreground Service başlatmak için, geliştiricinin hizmeti oluşturduktan sonra birkaç saniye içinde startForeground() yöntemini çağırması gerekir, aksi takdirde sistem bir ForegroundServiceDidNotStartInTimeException istisnası oluşturur. Bu, bildirilmemiş arka plan görevlerini önlemek için getirilen katı bir platform gereksinimidir.
Foreground Service mekanizması Android 1.0'da ilk SDK ile birlikte tanıtıldı, ancak zorunlu bildirim Android 9'da (API 28) ortaya çıktı. Bundan önce, bir hizmet kullanıcıya görünür bir gösterge olmadan ön planda çalışabiliyordu. Android 9'dan itibaren Google gereksinimleri sıkılaştırdı: startForeground çağıran herhangi bir uygulama, hizmet başladıktan sonra 5 saniye içinde bir bildirim sağlamalıdır.
Android 12'de (API 31), Foreground Service'in arka plan bağlamından başlatılmasına kısıtlamalar eklendi — artık birçok senaryo için FOREGROUND_SERVICE_SPECIAL_USE izni gerekiyor. Android 14 (API 34), manifestoda foregroundServiceType'ın zorunlu bildirimini getirerek hizmet mimarisini daha şeffaf ve öngörülebilir hale getirdi.
Foreground Service'in çalışma mekanizması üç temel aşamaya dayanır: hizmet oluşturma, bildirimi bağlama ve görevi yürütme. Hizmet Service sınıfından miras alır ve onStartCommand() yöntemini geçersiz kılar; burada bir tanımlayıcı ve Notification nesnesiyle startForeground() çağrılır.
startForeground() çağrıldıktan sonra sistem, hizmet sürecini yüksek hayatta kalma önceliğiyle ön plan grubuna taşır. Bu, Android'in RAM yükünden bağımsız olarak süreci çalışır durumda tutmaya çalışacağı anlamına gelir. Foreground Service normal koşullarda sistem tarafından durdurulamaz — yalnızca kullanıcının bildirimi kaydırarak kaldırması veya açıkça stopSelf() çağırmasıyla durdurulabilir.
Foreground Service'in yaşam döngüsü onCreate(), onStartCommand() ve onDestroy() yöntemleri aracılığıyla yönetilir. onStartCommand() içinde geliştirici, sürecin öldürülmesinden sonra yeniden başlatma stratejisini tanımlar — START_STICKY sabiti, kaynaklar geri kazanıldıktan sonra sistemi hizmeti yeniden oluşturmaya zorlarken, START_NOT_STICKY otomatik yeniden başlatmayı önler.
Foreground Service başlatıldığında, sırasıyla şu adımlar gerçekleştirilir: startService() çağrısı, onCreate() içinde Service nesnesi oluşturma, onStartCommand() içinde Intent işleme ve Notification nesnesiyle startForeground() çağrısı. Hizmet zaten çalışıyorsa ve yeni bir Intent gelirse, yalnızca onStartCommand() yeniden çağrılır — onCreate() hizmetin ömrü boyunca yalnızca bir kez yürütülür.
Foreground Service'in durdurulması, durum çubuğundan bildirimi gizleyen REMOVE_NOTIFICATION bayrağıyla stopForeground() aracılığıyla gerçekleşir. Bildirimi kaldırdıktan hemen sonra sistem, hizmeti ön plan olarak değerlendirmeyi bırakabilir ve önceliğini Background Service seviyesine düşürebilir, bu da süreci sonlandırmaya karşı savunmasız hale getirir.
PowerManager, Foreground Service'in çalışmasında önemli bir rol oynar çünkü Android'in güç tasarrufu modları (Doze, App Standby) görevleri yürütme yeteneğini sınırlayabilir. Ön plan durumunda olsa bile, hizmet pil politikalarına tabidir — ağ istekleri ertelenebilir ve zamanlayıcılar Doze pencereleriyle senkronize edilebilir. Gecikmelere toleranslı uzun süreli işlemler için Foreground Service'in WorkManager ile kombinasyon halinde kullanılması önerilir.
Android 14'ten (API 34) itibaren Google, manifestoda Foreground Service türünün zorunlu bildirimini getirdi. Her tür, izin verilen bir kullanım senaryosunu tanımlar — sistem, bildirilen tür ile gerçek hizmet davranışı arasındaki uyumu kontrol eder. Toplam 9 tür vardır, ancak en yaygın kullanılanlar aşağıdakilerdir.
dataSync türü, cihaz ve sunucu arasında veri senkronizasyonu, dosya aktarımı ve yedekleme için tasarlanmıştır. Örnekler arasında bulut depolamaya fotoğraf yükleme, Firebase ile veritabanı senkronizasyonu veya uzak bir sunucuya günlük yükleme yer alır. Bu tür, android:foregroundServiceType="dataSync" özelliği aracılığıyla manifestoda gerekçenin belirtilmesini gerektirir.
mediaPlayback türü, arka planda ses ve video oynatmak için kullanılır — müzik çalarlar, podcast istemcileri, video oynatıcılar. Bu, kullanıcı müdahalesi olmadan süresiz olarak çalışabilen tek türdür. Bildirim kanalı yüksek önceliğe sahip olmalı ve MediaStyle aracılığıyla oynatma kontrollerini görüntülemelidir — oynat, duraklat, sonraki, önceki düğmeleri.
location türü, coğrafi konum hizmetleri içindir — navigasyon uygulamaları, aktivite takibi, coğrafi sınırlar. Android 14+ için FOREGROUND_SERVICE_LOCATION iznini bildirmek ve manifestoda türü belirtmek gerekir. Uygulamanın çalışma zamanında etkin bir konum izni olmalıdır, aksi takdirde sistem hizmeti başlatmayı reddeder.
| Tür | İzin | Kullanım Örneği |
|---|---|---|
| dataSync | FOREGROUND_SERVICE_DATA_SYNC | Bulutla dosya senkronizasyonu |
| mediaPlayback | FOREGROUND_SERVICE_MEDIA_PLAYBACK | Arka planda müzik çalar |
| location | FOREGROUND_SERVICE_LOCATION | Sürüş sırasında GPS navigasyonu |
| camera | FOREGROUND_SERVICE_CAMERA | Video gözetim uygulaması |
| connectedDevice | FOREGROUND_SERVICE_CONNECTED_DEVICE | BLE cihazıyla çalışma |
Temel fark, Foreground ve Background Service arasında görünür bir bildirimin ve hayatta kalma önceliğinin bulunmasıdır. Background Service, bellek azaldığında sistem tarafından herhangi bir zamanda durdurulabilirken, Foreground Service Android Low Memory Killer mekanizmasındaki yükseltilmiş süreç adj seviyesi sayesinde çalışmaya devam eder.
Background Service bildirim gerektirmez ve kullanıcı tarafından fark edilmeden çalışabilir. Ancak, Android 8'den (API 26) itibaren Google, arka plan hizmetlerini önemli ölçüde kısıtladı: arka plan bağlamından startService() artık çalışmaz ve ön plana geçmeyi planlayan herhangi bir hizmeti başlatmak için Context.startForegroundService() zorunlu hale geldi. Sistem ayrıca Arka Plan Yürütme Sınırlamaları getirdi — bir zamanlayıcı (şu anda 10 dakika) ve sonrasında Background Service zorla durdurulur.
Foreground Service ise zaman sınırına sahip değildir. Hizmet saatler veya günler boyunca çalışabilir — kullanıcı onu açıkça durdurana veya cihazı yeniden başlatana kadar. Bu, Foreground Service'i sürekli arka plan çalışması gerektiren uygulamalar için en uygun seçim haline getirir: müzik çalarlar, aktivite izleyicileri, VoIP arama uygulamaları.
| Parametre | Foreground Service | Background Service |
|---|---|---|
| Bildirim | Zorunlu | Gerekli değil |
| Yaşam süresi | Sınırsız | 10 dakikaya kadar (API 26+) |
| Sistem önceliği | Yüksek (ADJ 2) | Düşük (ADJ 8+) |
| API 26+ başlatma | startForegroundService() | Arka plandan yasak |
Android 12'den (API 31) itibaren Google, Foreground Service başlatmaya önemli kısıtlamalar getirdi. Ana değişiklik, çoğu hizmet türü için arka plan bağlamından startForegroundService() çağırmanın yasaklanmasıdır. İstisnalar yalnızca kullanıcının açıkça izin vermesi durumunda (örneğin, FOREGROUND_SERVICE_SPECIAL_USE izni aracılığıyla) veya hizmetin BOOT_COMPLETED yayın intentine yanıt olarak başlatılması durumunda geçerlidir.
API 34+ hedefleyen uygulama manifestosu, bildirilen her hizmet için bir foregroundServiceType bloğu içermelidir. Örneğin, bir veri senkronizasyon hizmeti için android:foregroundServiceType="dataSync" belirtin. Tür belirtilmezse, sistem hizmeti geçersiz kabul eder ve başlatma girişiminde MissingForegroundServiceTypeException fırlatır. Google Play ayrıca tür uyumunu kontrol eder ve uyuşmazlık durumunda yayınlamayı reddedebilir.
Android 14'te (API 34), her Foreground Service türünün karşılık gelen bir izni vardır. Geliştirici bunları manifestoda bildirmeli ve hizmeti başlatmadan önce çalışma zamanında talep etmelidir. dataSync için FOREGROUND_SERVICE_DATA_SYNC gerekir; mediaPlayback için FOREGROUND_SERVICE_MEDIA_PLAYBACK gerekir. Kullanıcı ayarlardan izni iptal edebilir, bu da aktif hizmeti durdurur.
Google ayrıca Android 14'te Foreground Service Bildirim Zaman Aşımı mekanizmasını getirdi: hizmet oluşturulduktan sonra 10 saniye içinde startForeground() çağırmazsa, sistem bir istisna oluşturur. Bu sıkılaştırma, bildirim çağrısını geciktiren veya atlayan ve etkili bir şekilde foreground kılığında Background Service olarak çalışan uygulamalarla mücadele etmeyi amaçlamaktadır.
Foreground Service, arka planda garantili yürütme gerektiren geniş bir görev yelpazesinde kullanılır. En yaygın senaryolar arasında medya oynatma, coğrafi konum takibi, veri senkronizasyonu ve çevre birimleriyle çalışma bulunur. Her birini ayrıntılı olarak inceleyelim.
Klasik bir örnek, uygulama küçültüldükten sonra da oynatmaya devam eden bir müzik çalardır. Hizmet, MediaStyle bildirimi, kontrol düğmeleriyle başlar ve mediaPlayback türünü kullanır. Kullanıcı durum çubuğunda parça bilgilerini görür ve uygulamayı açmadan oynatmayı kontrol edebilir.
Navigasyon uygulamaları, sürekli koordinat takibi için location türünde Foreground Service kullanır. Hizmet, geçerli hız, seyahat süresi ve takibi durdurma düğmesi içeren bir bildirim görüntüler. Foreground Service olmadan sistem, birkaç dakika sonra arka planda koordinat almayı durdurur ve navigasyonu imkansız hale getirir.
Sesli ve görüntülü arama uygulamaları — VoIP istemcileri — aktif bir bağlantıyı sürdürmek için Foreground Service kullanır. phoneCall türündeki (Android 14'ten itibaren) hizmet, uygulama küçültüldüğünde aramanın düşmemesini sağlar. Bildirim, arama süresini ve mikrofon ile hoparlör kontrollerini görüntüler.
Veri senkronizasyonu için Kotlin'de bir Foreground Service oluşturmayı inceleyelim. Hizmet bir Activity'den başlatılacak, ilerleme durumunu gösteren bir bildirim görüntüleyecek ve tamamlandıktan sonra düzgün bir şekilde sonlanacaktır. Örnek, tüm zorunlu öğeleri gösterir: manifestoda bildirim, bildirim kanalı, startForeground() çağrısı ve foregroundServiceType işleme.
class SyncService : Service() {
companion object {
const val CHANNEL_ID = "sync_channel"
const val NOTIFICATION_ID = 1001
}
override fun onCreate() {
super.onCreate()
createNotificationChannel()
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
val notification = buildNotification()
startForeground(NOTIFICATION_ID, notification)
performSync()
return START_STICKY
}
private fun createNotificationChannel() {
val channel = NotificationChannel(
CHANNEL_ID,
"Senkronizasyon",
NotificationManager.IMPORTANCE_LOW
).apply {
description = "Veri senkronizasyon kanalı"
}
val manager = getSystemService(NotificationManager::class.java)
manager.createNotificationChannel(channel)
}
private fun buildNotification(): Notification {
return NotificationCompat.Builder(this, CHANNEL_ID)
.setContentTitle("Senkronizasyon")
.setContentText("Sunucuya veri yükleme")
.setSmallIcon(R.drawable.ic_sync)
.setOngoing(true)
.build()
}
private fun performSync() {
GlobalScope.launch(Dispatchers.IO) {
// Senkronizasyon emülasyonu
delay(5000)
stopForeground(Service.STOP_FOREGROUND_REMOVE)
stopSelf()
}
}
override fun onBind(intent: Intent): IBinder? = null
}
Hizmetin Android 12+'da doğru çalışması için, Foreground Service'i AndroidManifest.xml içinde türü ve gerekli izinlerle birlikte bildirmeniz gerekir. foregroundServiceType özelliği hedef API 34+ için zorunludur ve FOREGROUND_SERVICE_DATA_SYNC ile POST_NOTIFICATIONS izinleri çalışma zamanında talep edilmelidir.
<!-- AndroidManifest.xml -->
<uses-permission
android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission
android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
<uses-permission
android:name="android.permission.POST_NOTIFICATIONS" />
<application ...>
<service
android:name=".SyncService"
android:foregroundServiceType="dataSync"
android:exported="false" />
</application>
Yüksek güvenilirliğine rağmen, Foreground Service'in sınırlamaları vardır. Bunlardan en önemlisi kullanıcıya görünürlüktür. Uygulama, bildirim olmadan arka planda uzun süreli görevler gerçekleştiremez ve bu UX açısından her zaman kabul edilebilir değildir. Ayrıca sistem, bazı türler için zaman sınırı aşıldığında Foreground Service'i bile zorla durdurabilir — örneğin, dataSync birkaç saatlik çalışmayla sınırlıdır.
Foreground Service'e bir alternatif, ertelenmiş ve arka plan görevleri için bir Android Jetpack kitaplığı olan WorkManager'dir. WorkManager, cihaz yeniden başlatıldıktan sonra bile görev yürütmeyi garanti eder ve görev zincirlerini, periyodik işlemleri ve ağ ile pil kısıtlamalarını destekler. Çoğu arka plan işlemi için Google, doğrudan hizmet yerine WorkManager'i önerir.
JobScheduler, görevleri planlamak için Android'de yerleşik bir API'dir. Ertelenebilecek işlemler için uygundur: Wi-Fi senkronizasyonu, şarj cihazına bağlandığında veri indirme. JobScheduler, pilden tasarruf etmek için görevleri pencerelerde gruplandırır; oysa Foreground Service güç tasarrufu durumundan bağımsız olarak sürekli çalışır.
Kısa görevler için (10–15 saniyeye kadar), ertelenmiş yürütmeyle WorkManager'dan CoroutineWorker kullanabilirsiniz. Bir görevin belirli bir zamanda kesin olarak yürütülmesi gerekiyorsa, BroadcastReceiver ile birlikte AlarmManager kullanılır. Bu nedenle, Foreground Service uzun süreli sürekli işlemler için bir çözümdür, tüm arka plan senaryoları için evrensel bir araç değildir.
Sıkça Sorulan Sorular
Foreground Service, durum çubuğunda kalıcı bildirimi olan, kullanıcıya görünür uzun süreli görevleri gerçekleştiren bir Android hizmetidir. Yüksek hayatta kalma önceliğine sahiptir ve Background Service'in aksine, bellek azaldığında sistem tarafından durdurulmaz.
Foreground Service zorunlu bir bildirim görüntüler, zaman sınırı yoktur ve sistem sonlandırmasına karşı korunur. Background Service kullanıcı için görünmezdir, 10 dakikaya kadar (API 26+) çalışır ve herhangi bir zamanda Low Memory Killer tarafından durdurulabilir.
Android 14, 9 tür tanımlar: dataSync, mediaPlayback, location, camera, connectedDevice, phoneCall, microphone, health ve remoteMessaging. Her tür, ilgili bir izin ve foregroundServiceType özelliği aracılığıyla manifestoda bildirim gerektirir.
Hizmet, oluşturulduktan sonra 10 saniye içinde startForeground() çağırmazsa (Android 14), sistem bir ForegroundServiceDidNotStartInTimeException istisnası oluşturur ve hizmeti zorla durdurur. İşlem ana iş parçacığında çalışıyorsa uygulama ayrıca bir ANR (Application Not Responding) alır.
Hayır, Foreground Service bildirimini programatik olarak gizlemek imkansızdır. Android 9'dan (API 28) itibaren bildirim zorunludur ve kullanıcı tarafından kaydırılarak kaldırılamaz. Kaldırmanın tek yolu, stopForeground(REMOVE_NOTIFICATION) ve stopSelf() çağrılarak hizmeti durdurmaktır.
Ö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