Background: əsaslar, iOS və Android-də proqramın fonda işləməsi

Müəllif: IT Sectr Dərc olunub: 2026-03-03 Oxuma vaxtı: 10 dəq

Background — proqramın həyat dövrünün elə bir vəziyyətidir ki, o, işləməyə davam edir, lakin ekranda göstərilmir. iOS və Android-də fon işinin əsaslarını izah edirik: məhdudiyyətlər, vaxt limitləri, beginBackgroundTask, WorkManager və Service vasitəsilə fon tapşırıqları, həmçinin Background-ın düzgün işlənməsi üçün ən yaxşı təcrübələr.

Əsas məqamlar

  • Background — proqram istifadəçiyə görünmür, lakin məhdud müddət ərzində kod icra edə bilər
  • iOS background task — beginBackgroundTask(expirationHandler:) işi bitirmək üçün 30 saniyəyə qədər vaxt verir
  • Android Service — uzun fon əməliyyatları üçün bildirişlə Foreground Service
  • WorkManager — Android-də icra zəmanəti ilə fon tapşırıqları üçün tövsiyə olunan API
  • Məhdudiyyətlər — hər iki platforma batareyaya qənaət etmək üçün fon iş qaydalarını sərtləşdirir

Background — fon vəziyyətinin əsasları

Background — proqramın əməliyyat sistemində mövcud olmağa davam etdiyi, kod icra etdiyi və resurs istehlak etdiyi, lakin cihazın ekranında göstərilmədiyi vəziyyət. İstifadəçi Ana Ekranda, başqa proqramdadır və ya cihazın ekranı bloklanıb. iOS-da Background Inactive-dən sonra gəlir — keçid zənciri: Active → Inactive → Background. Android-də onStop Activity-nin Background-a keçdiyini bildirir.

Hər iki platforma fon işinə ciddi məhdudiyyətlər qoyur. iOS Background-a keçdikdən sonra kodun icrası üçün məhdud vaxt pəncərəsi (adətən 30 saniyə) təmin edir, bundan sonra proqram Suspended vəziyyətinə keçirilir. Android daha çevikdir: görünən bildirişlə Foreground Service məhdudiyyətsiz işləyə bilər, lakin adi Background Service bir neçə dəqiqə ilə məhdudlaşır. Proqramçının əsas vəzifəsi — vəziyyəti düzgün saxlamaq və sistem fon tapşırıqları API-ləri vasitəsilə işin davamını planlaşdırmaqdır.

Sistem yaddaş çatışmazlığı zamanı fon proqramını istənilən vaxt sonlandıra bilər. Sonlandırma zamanı bütün saxlanılmamış məlumatlar itirilir. Buna görə də applicationDidEnterBackground (iOS) və ya onStop (Android) daxilində vəziyyəti saxlamaq kritik əhəmiyyət daşıyır. Sonlandırmadan sonra növbəti işə salınmada proqram Not Running-dan soyuq başlanğıcla başlayır və saxlanılmış vəziyyəti bərpa edir.

Background vs Suspended

Background və Suspended-i fərqləndirmək vacibdir. Background — proqram aktiv şəkildə kod icra edir. Suspended — proqram yaddaşdadır, lakin kod icra etmir — dondurulub. iOS-da proqram fon tapşırıqları bitdikdən sonra Background-dan Suspended-ə keçir. Android-də Suspended yoxdur — proses ya mövcuddur (fon da daxil olmaqla), ya da sonlandırılıb (Not Running). Lakin Android LMK (Low Memory Killer) vasitəsilə thread-ların icrasını dayandıra bilər.

XüsusiyyətiOS BackgroundAndroid Background
Kod icra olunurBəli, 30 saniyəyə qədərBəli, API-dən asılıdır
UI görünürXeyrXeyr
Susmaya görə vaxt limiti~30 san (beginBackgroundTask)Bir neçə dəqiqə (Service)
Limitsiz işYalnız xüsusi kateqoriyalar (audio, VoIP, naviqasiya)Bildirişlə Foreground Service
İcra zəmanətiXeyr — sistem istənilən vaxt sonlandıra bilərWorkManager icraya zəmanət verir
İcazə tələb olunurBəli — Info.plist-də capabilitiesBəli — FOREGROUND_SERVICE icazəsi
Növbəti vəziyyətSuspended → Not RunningNot Running (və ya restart)

iOS-da Background: Swift, beginBackgroundTask və BGTaskScheduler

iOS-da Background applicationDidEnterBackground deleqat metodu vasitəsilə işlənir. Bu metodda proqramçı istifadəçinin vəziyyətini saxlamalı, resursları boşaltmalı və fon tapşırıqlarını bitirməlidir. Background-a keçdikdən sonra kodun icrası üçün beginBackgroundTask(expirationHandler:) istifadə olunur — sistemdən əlavə vaxt (adətən 30 saniyə) tələb edən API. Tapşırıq bu müddətdə bitməzsə, expirationHandler çağırılır və proqram məcburi olaraq Suspended vəziyyətinə keçirilir.

iOS 13-dən etibarən Apple BGTaskScheduler təqdim etdi — fon tapşırıqlarını planlaşdırmaq üçün müasir API. Fərqli olaraq beginBackgroundTask, yalnız fondan çıxandan sonra bitirmə vaxtı verir, BGTaskScheduler gələcəkdə tapşırıqların icrasını planlaşdırmağa imkan verir — məsələn, məzmunun saatda bir dəfə yenilənməsi və ya gecə analitikanın yüklənməsi. BGTaskScheduler yeni layihələr üçün tövsiyə olunan yanaşmadır, çünki batareya baxımından daha səmərəlidir.

swift
import UIKit
import BackgroundTasks

@main
class AppDelegate: UIResponder, UIApplicationDelegate {

    var backgroundTaskID: UIBackgroundTaskIdentifier = .invalid

    // Proqram fonda keçdi — fon tapşırığına başlayırıq
    func applicationDidEnterBackground(_ application: UIApplication) {
        saveAppState()
        startBackgroundTask()
    }

    private func startBackgroundTask() {
        backgroundTaskID = UIApplication.shared.beginBackgroundTask { [weak self] in
            // Vaxt bitdi — məcburi sonlandırırıq
            self?.endBackgroundTask()
        }

        // Fon işini simulyasiya edirik (məlumatların serverə saxlanması)
        DispatchQueue.global().async { [weak self] in
            uploadAnalyticsData()
            self?.endBackgroundTask()
        }
    }

    private func endBackgroundTask() {
        guard backgroundTaskID != .invalid else { return }
        UIApplication.shared.endBackgroundTask(backgroundTaskID)
        backgroundTaskID = .invalid
    }

    // BGTaskScheduler qeydiyyatı
    func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
    ) -> Bool {
        BGTaskScheduler.shared.register(
            forTaskWithIdentifier: "com.example.refresh",
            using: nil
        ) { task in
            handleAppRefresh(task: task as! BGAppRefreshTask)
        }
        return true
    }

    func scheduleAppRefresh() {
        let request = BGAppRefreshTaskRequest(identifier: "com.example.refresh")
        request.earliestBeginDate = Date(timeIntervalSinceNow: 3600)
        try? BGTaskScheduler.shared.submit(request)
    }

    func handleAppRefresh(task: BGAppRefreshTask) {
        scheduleAppRefresh()
        task.expirationHandler = { task.setTaskCompleted(success: false) }
        fetchLatestData { result in
            task.setTaskCompleted(success: result)
        }
    }
}

Kod iOS-da Background-ın tam işlənməsini göstərir. applicationDidEnterBackground vaxt limiti və expirationHandler ilə beginBackgroundTask vasitəsilə fon tapşırığına başlayır. Paralel olaraq dövri məzmun yeniləməsi üçün BGTaskScheduler qeydiyyatdan keçirilir. beginBackgroundTask dərhal işin bitirilməsi üçün, BGTaskScheduler isə uzunmüddətli planlaşdırma üçün istifadə olunur. Hər iki API tapşırıq identifikatorlarının düzgün idarə edilməsini tələb edir.

Android-də Background: Kotlin, Service, WorkManager

Android-də Background bir neçə API vasitəsilə idarə olunur. Ənənəvi Service fonda kod icra etməyə imkan verir, lakin Android 8+ (API 26) ilə Background Service məhdudlaşdırılıb: sistem proqram fondan çıxdıqdan bir neçə dəqiqə sonra onu sonlandırır. Daimi bildirişlə Foreground Service limitsiz işləyə bilər. WorkManager — cihaz yenidən başladıqdan sonra belə icra zəmanəti ilə fon tapşırıqları üçün tövsiyə olunan həll.

Android, iOS-dan fərqli olaraq, uzunömürlü fon proseslərini dəstəkləyir. Foreground Service istifadəçinin görməli olduğu tapşırıqlar üçün istifadə olunur — musiqi pleyer, naviqasiya, məşq qeydi. JobScheduler və WorkManager təxirə salına bilən tapşırıqlar üçündür: məlumat sinxronizasiyası, logların yüklənməsi, keş yeniləməsi. Əsas fərq: Android şərtlərlə tapşırıqları planlaşdırmağa imkan verir — Wi-Fi, şarj, cihazın aktiv olmaması, bu da batareyaya və trafikə qənaət edir.

kotlin
import android.app.Service
import android.content.Intent
import android.os.IBinder
import androidx.work.*

// 1. Uzun fon işi üçün Foreground Service
class SyncService : Service() {

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        val notification = createNotification()
        startForeground(NOTIFICATION_ID, notification)
        performBackgroundWork()
        return START_STICKY
    }

    private fun performBackgroundWork() {
        Thread {
            // Məlumatların serverlə sinxronizasiyası
            syncDataToServer()
            stopForeground(STOP_FOREGROUND_REMOVE)
            stopSelf()
        }.start()
    }

    override fun onBind(intent: Intent?): IBinder? = null
}

// 2. Təxirə salınmış fon tapşırıqları üçün WorkManager
class DataSyncWorker(
    private val context: Context,
    private val params: WorkerParameters
) : CoroutineWorker(context, params) {

    override suspend fun doWork(): Result {
        return try {
            // Analitikanın serverə yüklənməsi
            uploadAnalytics()
            Result.success()
        } catch (e: Exception) {
            if (runAttemptCount < 3) Result.retry() else Result.failure()
        }
    }
}

// WorkManager tapşırığının planlaşdırılması
fun scheduleBackgroundSync(context: Context) {
    val constraints = Constraints.Builder()
        .setRequiredNetworkType(NetworkType.CONNECTED)
        .setRequiresBatteryNotLow(true)
        .build()

    val request = OneTimeWorkRequestBuilder<DataSyncWorker>()
        .setConstraints(constraints)
        .setBackoffCriteria(BackoffPolicy.EXPONENTIAL, 30, TimeUnit.SECONDS)
        .build()

    WorkManager.getInstance(context).enqueue(request)
}

Kod Android-də fon işi üçün iki yanaşma göstərir. SyncService — dərhal və uzun fon işi üçün bildirişlə Foreground Service. DataSyncWorker — şərtlərlə (Wi-Fi, şarj) təxirə salınmış tapşırıqlar üçün WorkManager. WorkManager cihaz yenidən başladıqdan sonra belə icraya zəmanət verir və təkrar cəhdlər üçün exponential backoff dəstəkləyir. Foreground Service status panelində daimi bildiriş tələb edir.

iOS və Android-də fon işinin məhdudiyyətləri

Hər iki mobil platforma daim fon iş qaydalarını sərtləşdirir. iOS-da hər yeni OS nəsli fonda iş vaxtını qısaldır və yeni məhdudiyyətlər əlavə edir. Android-də Google getdikcə daha sərt enerji qənaət rejimləri tətbiq edir (Doze, App Standby). Proqramçı aktual məhdudiyyətlərdən xəbərdar olmalıdır ki, proqram sistem tərəfindən vaxtından əvvəl sonlandırılmasın.

iOS 13-dən başlayaraq, sistem fon vaxtından sui-istifadə edən proqramlar üçün fon tapşırıqlarını söndürür. Hər proqram istifadəçi davranışına əsasən müəyyən limitlər alır. BGTaskScheduler icranı optimal vaxta planlaşdırır — məsələn, cihaz Wi-Fi-a qoşulduqda və şarj olarkən. BGTaskScheduler-dan düzgün istifadə edən proqramlar daha çox fon vaxtı alır.

Android 9-dan (API 28) başlayaraq, fon işi cihaz hərəkətsiz olduqda aktivləşən Doze rejimi ilə məhdudlaşdırılır. Doze-də olan proqramlar fon tapşırıqlarını icra edə bilməz, şəbəkə söndürülür, JobScheduler və WorkManager tapşırıqları Doze-dən çıxana qədər təxirə salır. Foreground Service Doze-dən yan keçməyin yeganə yoludur, lakin sui-istifadə proqramın istifadəçi tərəfindən bloklanmasına və icazələrin silinməsinə səbəb olur.

MəhdudiyyətiOSAndroid
Fon tapşırığının vaxt limiti~30 saniyə (beginBackgroundTask)Bir neçə dəqiqə (JobScheduler)
Limitsiz fonAudio, VoIP, naviqasiya, BluetoothForeground Service + bildiriş
Enerji qənaətiLow Power Mode — fon tapşırıqlarını söndürürDoze, App Standby, Battery Optimization
PlanlaşdırmaBGTaskScheduler (iOS 13+)WorkManager (Android Jetpack)
Yenidən başlatmadan sonraYalnız push bildirişiWorkManager tapşırıqları saxlayır
Maks. icra müddəti~30 dəqiqə (audio)Limitsiz (Foreground Service)

Fon işi üçün ən yaxşı təcrübələr

Birinci qayda — fonda resurs istehlakını minimuma endirin. Əksər fon tapşırıqları cihaz şarj olarkən və Wi-Fi-a qoşulduqda təxirə salına bilər. Şərtlərlə tapşırıqların planlaşdırılması üçün BGTaskScheduler (iOS) və WorkManager (Android) istifadə edin. Fonda ağır hesablamalar işə salmayın — bu batareyanı boşaldır və CPU throttling-ə səbəb olur.

İkinci qayda — həmişə beginBackgroundTask üçün expirationHandler təyin edin. Proqram tapşırığı ayrılmış vaxtda bitirməsə, sistem onu məcburi olaraq Suspended-ə keçirəcək və ya sonlandıracaq. ExpirationHandler məlumatları saxlamaq və işi düzgün bitirmək üçün son şansdır. Android-də WorkManager-də setForegroundAsync istifadə edin adi tapşırığı foreground-a çevirmək üçün, əgər daha çox vaxt tələb olunursa.

Üçüncü qayda — işə salmadan əvvəl fon işi məhdudiyyətlərini yoxlayın. iOS-da qalan vaxtı yoxlamaq üçün UIApplication.shared.backgroundTimeRemaining istifadə edin. Android-də ActivityManager.isBackgroundRestricted() yoxlayın — əgər true-dursa, proqram fon tapşırıqlarını işə sala bilməyəcək və istifadəçiyə parametrlərdə məhdudiyyətləri götürməyi təklif etmək lazımdır. Bu xüsusilə kritik fon funksiyaları olan proqramlar üçün vacibdir — alarmlar, təqvimlər, sinxronizasiya.

Dördüncü qayda — fon tapşırıqlarını real cihazda test edin. Simulyator və emulyator real fon iş məhdudiyyətlərini əks etdirmir. iOS-da Xcode-da Debug → Simulate Background Fetch istifadə edin. Android-də — adb shell am broadcast -a android.intent.action.ACTION_BOOT_COMPLETED yenidən başlatmadan sonra WorkManager-i test etmək üçün. Aşağı batareya səviyyəsi olan real cihazda testlər fon işi problemlərinin çoxunu aşkar edir.

swift
import UIKit

final class BackgroundTaskManager {
    static let shared = BackgroundTaskManager()
    private var tasks: [String: UIBackgroundTaskIdentifier] = [:]

    func startTask(name: String, expiration: @escaping () -> Void) {
        let remaining = UIApplication.shared.backgroundTimeRemaining
        print("Fonda qalan vaxt: \(remaining) san")

        let task = UIApplication.shared.beginBackgroundTask { [weak self] in
            print("Tapşırıq üçün vaxt bitdi: \(name)")
            expiration()
            self?.endTask(name: name)
        }

        tasks[name] = task
    }

    func endTask(name: String) {
        guard let task = tasks.removeValue(forKey: name),
              task != .invalid
        else { return }
        UIApplication.shared.endBackgroundTask(task)
    }
}

Kod qalan vaxtı izləyən və identifikatorları idarə edən fon tapşırıqları menecerini göstərir. backgroundTimeRemaining məcburi sonlandırmaya qədər saniyələrin sayını qaytarır — əgər dəyər sonsuzdursa, proqram məhdudiyyətsiz işləyir (audio, naviqasiya). Menecer müxtəlif adlarla bir neçə fon tapşırığı işə salmağa və hər birini düzgün bitirməyə imkan verir. Bu yanaşma fon tapşırıqlarının sızmasının qarşısını alır və sistemin bağlanmamış tapşırıqlara görə proqramı sonlandırmayacağına zəmanət verir.

Tez-tez verilən suallar

iOS proqramı fonda əbədi işləyə bilərmi?

Bəli, məhdud sayda kateqoriya üçün: audio (AVAudioSession kateqoriyası .playback), VoIP (PushKit), naviqasiya (CLLocationManager ilə allowsBackgroundLocationUpdates), Bluetooth (central background mode), fon yeniləməsi (BGTaskScheduler). Qalanları üçün — maksimum 30 saniyə. iOS 16+-da Apple icazə verilən kateqoriyalar üçün də tələbləri sərtləşdirib.

beginBackgroundTask BGTaskScheduler-dan nə ilə fərqlənir?

beginBackgroundTask — fondan çıxdıqdan sonra proqramın ömrünü ~30 saniyə uzatmaq üçün sinxron API. applicationDidEnterBackground-da çağırılır. BGTaskScheduler — sistem trigger-ləri (vaxt, yer, məzmun yeniləməsi) vasitəsilə gələcəkdə tapşırıqları planlaşdırmaq üçün asinxron API. BGTaskScheduler Apple tərəfindən iOS 13+ üçün tövsiyə olunan müasir yanaşmadır.

Niyə Android Background Service-imizi öldürür?

Android 8-dən (API 26) başlayaraq, Background Service proqram fondan çıxdıqdan bir neçə dəqiqə sonra sonlandırılır. Həll yolu: uzun əməliyyatlar üçün bildirişlə Foreground Service və ya təxirə salınmış tapşırıqlar üçün WorkManager istifadə edin. Parametrlərdə proqramınız üçün Battery Optimization yoxlayın — əgər optimallaşdırılıbsa, sistem fon tapşırıqlarını təxirə sala və ya ləğv edə bilər.

Background-u iOS simulyatorunda necə test etmək olar?

Ana Ekrana keçmək üçün Cmd+Shift+H düyməsini basın. Xcode-da Debug → Simulate Background Fetch istifadə edin. beginBackgroundTask yoxlamaq üçün konsolu açın (Shift+Cmd+C) və e UIApplication.shared.backgroundTimeRemaining çağırın. Xcode 15+-da simulyatorun Diagnostics tabında Background Execution ssenarisi mövcuddur.

Android-də process death nədir?

Process Death — resurs çatışmazlığı və ya fonda hərəkətsizlik zamanı Android sisteminin prosesi sonlandırması. iOS-dan fərqli olaraq, Android-də Suspended yoxdur — proses ya canlıdır (fon da daxil olmaqla), ya da ölüdür (Not Running). Process Death OS-nin normal davranışıdır və proqram ondan sonra SavedStateHandle, onSaveInstanceState və ya DataStore vasitəsilə vəziyyəti düzgün bərpa etməlidir.

Nəticə

  • Background — proqram ekranda görünmür, lakin kod icra edir, Suspended-dən fərqli olaraq (dondurulub)
  • iOS — beginBackgroundTask (30 san.-yə qədər) və gələcək tapşırıqların planlaşdırılması üçün BGTaskScheduler
  • Android — uzun əməliyyatlar üçün Foreground Service, zəmanətli təxirə salınmış tapşırıqlar üçün WorkManager
  • Məhdudiyyətlər — hər iki platforma fon iş qaydalarını sərtləşdirir: Doze, Low Power Mode, App Standby
  • Saxlama — applicationDidEnterBackground və onStop — Suspended/Not Running-dən əvvəl məlumatları saxlamaq üçün son şans
  • Planlaşdırma — BGTaskScheduler və WorkManager şərtlərlə işləyir (Wi-Fi, şarj, vaxt)
  • Foreground Service — hər iki platformada limitsiz fon işinin yeganə yolu

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.

Layihəni müzakirə et

Həm də oxuyun