Background Execution, mobil uygulama ön planda olmadığında kodun çalıştırılmasını sağlayan bir mekanizmadır. Bu mekanizma olmadan, sistem uygulamayı simge durumuna küçültüldüğünde askıya alır. Apple, 2026'ya göre, iOS arka plan süresini 30 saniye ile sınırlandırırken, Android WorkManager ve Foreground Service aracılığıyla daha esnek senaryolar sunar.
Önemli Noktalar
Background Execution, bir uygulamanın kullanıcı tarafından simge durumuna küçültüldükten veya başka bir uygulamaya geçildikten sonra kod çalıştırmaya devam etme yeteneğidir. Özel mekanizmalar olmadan, mobil işletim sistemi, arka plana geçtikten birkaç saniye içinde uygulamayı Suspended (askıya alınmış) durumuna getirerek etkin uygulamalar için CPU ve belleği serbest bırakır.
Bir mobil uygulama, yaşam döngüsünün birkaç durumundan geçer: Foreground (etkin), Background (arka planda), Suspended (askıya alınmış) ve Terminated (sonlandırılmış). Background, uygulamanın görünür bir arayüz olmadan kod çalıştırabildiği tek durumdur. iOS ve Android bu durumdaki süreyi ve mevcut işlemleri farklı şekilde tanımlar.
Arka plan yürütme, veri senkronizasyonu, içerik indirme, Push bildirimi işleme, arka plan coğrafi konum ve ses çalma için gereklidir. Senkronizasyon en yaygın senaryodur: uygulama, kullanıcı müdahalesi olmadan sunucuya veri gönderir veya güncellemeleri indirir.
Arka plan yürütmenin sınırlamaları üç faktörden kaynaklanır: enerji tüketimi, cihaz performansı ve kullanıcı gizliliği. CPU ve radyo modülleri (Wi-Fi, hücresel veri) en fazla enerjiyi tüketir — her arka plan işlemi pil ömrünü azaltır.
Google araştırmaları, her 5 dakikada bir arka plan görevi çalıştıran uygulamaların cihazın pil ömrünü günde %20–30 oranında azalttığını göstermektedir. Saatte bir kez sıklığında optimize edilmiş arka plan işlemleri bile, bu tür ikiden fazla uygulama varsa belirgin bir etkiye sahiptir.
Her arka plan uygulaması RAM kaplar. RAM yetersiz olduğunda, sistem uygulamaları bellekten boşaltır ve bu da kullanıcı geri döndüğünde yeniden başlatmaya neden olur. iOS, Jetsam algoritmasını kullanır — bellek sınırı aşıldığında arka plan işlemlerini zorla sonlandırma mekanizması. Android, benzer bir prensiple LMK (Low Memory Killer) kullanır.
Android 10 ve iOS 13'ten itibaren sistem, uygulamaların arka plan çalışmasının amacını beyan etmesini gerektirir. Android, arka planda Broadcast Receiver başlatılmasına kısıtlamalar getirdi. iOS, proje Yeteneklerinde (Capabilities) Background Mode belirtilmesini gerektirir. Kullanıcı, ayarlardan herhangi bir uygulama için arka plan yürütmeyi devre dışı bırakabilir.
| İşletim Sistemi | Sürüm | Kısıtlama | Etki |
|---|---|---|---|
| Android | 8.0 | IMPLICIT_BROADCAST yasak | Arka plan Broadcast'lerin %67'si bozuk |
| Android | 9.0 | Doze iyileştirildi | Ağ çağrıları kısıtlandı |
| Android | 12+ | Foreground Service kısıtlandı | Arka plandan başlatma yasak |
| iOS | 7+ | Background App Refresh | Periyodik güncelleme pencereleri |
| iOS | 13+ | BGTaskScheduler | Yürütme yerine planlama |
Android, arka plan yürütme için her biri farklı bir görev kategorisini çözen birkaç mekanizma sağlar. WorkManager, ertelenmiş ve periyodik görevler için önerilen API'dir. Foreground Service, görünür bir bildirimle anında yürütme içindir. JobScheduler, WorkManager'ın düşük seviyeli bir alternatifidir.
WorkManager, Android Jetpack'in bir parçasıdır ve cihaz yeniden başlatıldıktan sonra bile tamamlanma garantisiyle arka plan görev yürütme sağlar. API, ağ durumunu, pil seviyesini ve Doze modunu dikkate alarak en uygun yürütme zamanını seçer. WorkManager, API 14+ ile uyumludur ve kullanımdan kaldırılan AlarmManager ve JobScheduler'ın yerini alır.
Bir uygulamanın kullanıcıya görünür bir görevi (müzik çalma, coğrafi konum kaydı) gerçekleştirmesi gerektiğinde, Foreground Service kullanılır. Hizmet, durum çubuğunda kalıcı bir bildirim gösterir ve daha yüksek önceliğe sahiptir — sistem, görev tamamlanana kadar onu sonlandırmaz. Android 13'ten itibaren POST_NOTIFICATIONS izni gereklidir.
Android 6.0'dan itibaren cihaz, boşta olduğunda Doze moduna girer. Bu modda ağ işlemleri, senkronizasyon ve JobScheduler ertelenir. WorkManager, Doze'a otomatik olarak uyum sağlar — görevler, cihaz bakım için uykudan uyandığında bir sonraki Bakım Penceresi (Maintenance Window) sırasında yürütülür.
iOS, arka plan yürütmeye daha katı bir yaklaşım benimser. Background App Refresh, periyodik veri güncellemesi için ana mekanizmadır. BGTaskScheduler, sistem durumuna göre görevleri planlamak için API'dir. Uzun süreli işlemler için Background Modes mevcuttur: audio, location, voip, fetch ve processing.
Background App Refresh, uygulamanın verileri senkronize etmek için her 15–30 dakikada bir uyanmasına izin verir. Uyanma süresi kullanıcı davranışına bağlıdır — sistem, kullanıcının uygulamayı ne sıklıkta açtığını analiz eder. Kullanıcılar, Ayarlar — Genel — Background App Refresh'te tek tek uygulamalar için bu özelliği devre dışı bırakabilir.
iOS 13'ten itibaren BGTaskScheduler, kullanımdan kaldırılan performFetch ve beginBackgroundTask'in yerini almıştır. Uygulama, bir tanımlayıcı ve minimum aralıkla görevleri kaydeder ve sistem en uygun yürütme zamanını belirler. Görevler iki türe ayrılır: BGProcessingTask (uzun, 10+ dakika) ve BGAppRefreshTask (kısa, 30 saniyeye kadar).
iOS, arka plan görev yürütmesi için sınırlı süre ayırır — BGAppRefreshTask için 30 saniyeye kadar ve BGProcessingTask için 10 dakikaya kadar. Sınır aşıldığında, sistem görevi zorla sonlandırır. Geliştirici, ara sonuçları kaydetmek için süre sonu işleyicisini (expiration handler) çağırmalıdır.
WorkManager kullanarak Android'de arka plan yürütmenin pratik bir uygulamasına bakalım. Ağ durumu farkındalığı ile her 8 saatte bir veri senkronizasyonu örneği. WorkManager, cihaz yeniden başlatıldıktan sonra bile görev yürütmeyi garanti eder.
class SyncWorker(context: Context, params: WorkerParameters) : Worker(context, params) {
override fun doWork(): Result {
return try {
syncDataToServer()
Log.d("Sync", "Veriler senkronize edildi")
Result.success()
} catch (e: Exception) {
Result.retry()
}
}
}
// Her 8 saatte bir periyodik görevi çalıştır
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.setRequiresCharging(false)
.build()
val syncRequest = PeriodicWorkRequestBuilder<SyncWorker>(
8, TimeUnit.HOURS
).setConstraints(constraints).build()
WorkManager.getInstance(context).enqueue(syncRequest)
Kullanıcıya görünür uzun süreli işlemler için Foreground Service kullanın. Bildirimde ilerleme durumu gösteren dosya indirme örneği. Hizmet, kaldırılamayan bir bildirimle startForeground() öğesini çağırır. İndirme tamamlandığında — stopForeground(STOP_FOREGROUND_REMOVE).
class DownloadService : Service() {
override fun onStartCommand(intent: Intent?, flags: Int, id: Int): Int {
startForeground(NOTIFICATION_ID, createNotification())
downloadFile()
stopForeground(STOP_FOREGROUND_REMOVE)
stopSelf()
return START_NOT_STICKY
}
private fun createNotification(): Notification {
return NotificationCompat.Builder(this, CHANNEL_ID)
.setContentTitle("Dosyayı indir")
.setSmallIcon(android.R.drawable.ic_download)
.build()
}
}
iOS'te arka plan yürütme, BGTaskScheduler aracılığıyla yapılandırılır. İçerik güncelleme görevini kaydetme ve yürütme örneği. Uygulama, Info.plist'te görev tanımlayıcısını kaydetmeli ve görev planlanması gerektiğinde submit'i çağırmalıdır.
import BackgroundTasks
func registerBackgroundTask() {
BGTaskScheduler.shared.register(
forTaskWithIdentifier: "com.app.refresh",
using: nil
) { task in
self.handleAppRefresh(task: task as! BGAppRefreshTask)
}
}
func scheduleAppRefresh() {
let request = BGAppRefreshTaskRequest(
identifier: "com.app.refresh"
)
request.earliestBeginDate = Date(timeIntervalSinceNow: 15 * 60)
try? BGTaskScheduler.shared.submit(request)
}
func handleAppRefresh(task: BGAppRefreshTask) {
scheduleAppRefresh()
task.expirationHandler = {
// Ara verileri kaydet
cacheCurrentState()
}
fetchLatestData {
task.setTaskCompleted(success: true)
}
}
Uzun süreli işlemler (önbellek temizleme, veri işleme) için BGProcessingTask kullanın. Sistem, yürütme için 10 dakikaya kadar izin verir. Yalnızca cihaz şarj oluyorken ve Wi-Fi'ye bağlıyken çalışır. Info.plist'te ayrı bir tanımlayıcı ve register(forTaskWithIdentifier:) aracılığıyla kayıt gerektirir.
func scheduleProcessing() {
let request = BGProcessingTaskRequest(
identifier: "com.app.cleanup"
)
request.requiresExternalPower = true
request.requiresNetworkConnectivity = true
request.earliestBeginDate = Date(timeIntervalSinceNow: 24 * 60 * 60)
try? BGTaskScheduler.shared.submit(request)
}
Android ve iOS, arka plan yürütme felsefesinde temel olarak farklılık gösterir. Android, daha fazla kontrole sahip esnek araçlar sunar ancak geliştiricinin doğru API'yi seçmesini gerektirir. iOS, yetenekleri sınırlar ancak kullanıcı için kararlı performans ve pil ömrü garanti eder.
| Kriter | Android | iOS |
|---|---|---|
| Önerilen API | WorkManager | BGTaskScheduler |
| Maks. görev süresi | Sınırsız (Foreground Service) | 30 sn / 10 dk (processing) |
| Periyodik görevler | Evet, PeriodicWorkRequest ile | Evet, BGAppRefreshTask ile |
| Yürütme garantisi | Evet, yeniden başlatmadan sonra bile | Hayır — sistem ne zaman karar verir |
| Arka plan ağ erişimi | Doze modu ile sınırlı | background config ile URLSession aracılığıyla |
| Arka plan coğrafi konum | Foreground Service + izin | Background Mode location + NSLocation |
| Arka plan ses | Medya bildirimli Foreground Service | Background Mode audio + AVAudioSession |
WorkManager, uygulama durumundan bağımsız olarak tamamlanması gereken görevler için idealdir: veri senkronizasyonu, analitik gönderme, kuyruk işleme. API, cihaz kapatıldıktan sonra bile yürütmeyi garanti eder — görev, başlatıldıktan sonra yeniden planlanır.
BGTaskScheduler, sistemin uygun herhangi bir zamanda gerçekleştirebileceği görevler için uygundur: yeni içerik indirme, widget'ları güncelleme, önbelleği temizleme. Acil işlemler için uygun değildir — cihaz Doze modundaysa veya pili zayıfsa sistem görevi erteler.
Sıkça Sorulan Sorular
Background Execution, arka planda çalışan herhangi bir kodu tanımlayan genel bir kavramdır. Background Modes, bir uygulamanın belirli türde arka plan işlemleri (ses, coğrafi konum, VoIP, fetch) gerçekleştirmesine izin veren iOS'a özgü bir mekanizmadır. Android, Foreground Service türleri aracılığıyla benzer bir yaklaşım kullanır.
iOS'te bu, BGAppRefreshTask için standart sınırdır. Sınıra ulaşıldığında sistem görevi zorla sonlandırır. Android'de, uygulama WorkManager veya Foreground Service kullanmadığında benzer bir durum oluşur — normal bir Service, arka plana geçtikten sonra sistem tarafından sonlandırılır.
Android'de WorkManager kullanın — yeniden başlatmadan sonra bile yürütmeyi garanti eder. iOS'te yürütme garanti edilemez — sistem görevin ne zaman çalıştırılacağına karar verir. Yürütmeyi garanti etmenin tek yolu, kullanıcı için görünür bir göstergeyle Background Modes (audio, location) kullanmaktır.
iOS'te UIApplication.shared.backgroundRefreshStatus öğesini çağırın — durum .available, .denied veya .restricted. Android'de, pil optimizasyonu muafiyetini kontrol etmek için PowerManager.isIgnoringBatteryOptimizations() kullanın. WorkManager için kontrol gerekmez — API, sistem kısıtlamalarını kendisi halleder.
Push bildirimleri, arka plan kodu olmadan eylemleri tetiklemek için ana mekanizmadır. iOS'te VoIP için PushKit ve veri güncellemesi için Silent Push mevcuttur. Android'de — High Priority FCM ve Notification Trampoline. Foreground Service aracılığıyla WebSockets, gerçek zamanlı uygulamalar için bir alternatiftir.
Ö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