Background: dasar-dasar, kerja aplikasi di latar belakang iOS dan Android

Penulis: IT Sectr Diterbitkan: 2026-03-03 Waktu membaca: 10 mnt

Background — status siklus hidup aplikasi di mana ia terus berjalan tetapi tidak ditampilkan di layar. Menjelaskan dasar-dasar kerja latar belakang di iOS dan Android: batasan, waktu habis, tugas latar belakang melalui beginBackgroundTask, WorkManager dan Service, serta praktik terbaik untuk pemrosesan Background yang benar.

Poin utama

  • Background — aplikasi tidak terlihat oleh pengguna tetapi dapat menjalankan kode untuk waktu terbatas
  • iOS background task — beginBackgroundTask(expirationHandler:) memberikan hingga 30 detik untuk menyelesaikan pekerjaan
  • Android Service — Foreground Service dengan notifikasi untuk operasi latar belakang yang panjang
  • WorkManager — API yang direkomendasikan untuk tugas latar belakang di Android dengan jaminan eksekusi
  • Batasan — kedua platform memperketat aturan kerja latar belakang untuk menghemat baterai

Background — dasar-dasar status latar belakang

Background — status aplikasi di mana ia terus ada di sistem operasi, menjalankan kode dan mengonsumsi sumber daya, tetapi tidak ditampilkan di layar perangkat. Pengguna berada di Layar Beranda, di aplikasi lain atau layar perangkat terkunci. Di iOS Background mengikuti Inactive — rantai transisi: Active → Inactive → Background. Di Android onStop menandakan transisi Activity ke Background.

Kedua platform memberlakukan batasan ketat pada kerja latar belakang. iOS menyediakan jendela terbatas (biasanya 30 detik) untuk menjalankan kode setelah masuk ke Background, setelah itu aplikasi dialihkan ke Suspended. Android lebih fleksibel: Foreground Service dengan notifikasi terlihat dapat bekerja tanpa batas, tetapi Background Service biasa dibatasi beberapa menit. Tugas utama pengembang — menyimpan status dengan benar dan merencanakan kelanjutan pekerjaan melalui API sistem tugas latar belakang.

Sistem dapat mengakhiri aplikasi latar belakang kapan saja saat kekurangan memori. Saat diakhiri, semua data yang belum disimpan akan hilang. Oleh karena itu sangat penting untuk menyimpan status di applicationDidEnterBackground (iOS) atau onStop (Android). Setelah diakhiri, pada peluncuran berikutnya aplikasi mulai dari Not Running dengan cold start dan memulihkan status yang disimpan.

Background vs Suspended

Penting untuk membedakan Background dan Suspended. Background — aplikasi secara aktif menjalankan kode. Suspended — aplikasi berada di memori tetapi tidak menjalankan kode — dibekukan. Di iOS aplikasi beralih dari Background ke Suspended setelah menyelesaikan tugas latar belakang. Di Android tidak ada Suspended — proses ada (termasuk latar belakang) atau diakhiri (Not Running). Namun Android dapat menangguhkan eksekusi thread melalui LMK (Low Memory Killer).

KarakteristikiOS BackgroundAndroid Background
Kode dijalankanYa, hingga 30 detikYa, tergantung API
UI terlihatTidakTidak
Batas waktu default~30 detik (beginBackgroundTask)Beberapa menit (Service)
Kerja tanpa batasHanya kategori khusus (audio, VoIP, navigasi)Foreground Service dengan notifikasi
Jaminan eksekusiTidak — sistem dapat mengakhiri kapan sajaWorkManager menjamin eksekusi
Memerlukan izinYa — capabilities di Info.plistYa — izin FOREGROUND_SERVICE
Status berikutnyaSuspended → Not RunningNot Running (atau restart)

Background di iOS: Swift, beginBackgroundTask dan BGTaskScheduler

Di iOS Background diproses melalui metode delegasi applicationDidEnterBackground. Dalam metode ini pengembang harus menyimpan status pengguna, membebaskan sumber daya dan menyelesaikan tugas latar belakang. Untuk menjalankan kode setelah masuk ke Background digunakan beginBackgroundTask(expirationHandler:) — API yang meminta waktu tambahan (biasanya 30 detik) dari sistem. Jika tugas tidak selesai dalam waktu ini, expirationHandler dipanggil dan aplikasi dipindahkan secara paksa ke Suspended.

Sejak iOS 13, Apple memperkenalkan BGTaskScheduler — API modern untuk menjadwalkan tugas latar belakang. Tidak seperti beginBackgroundTask yang hanya memberikan waktu untuk menyelesaikan setelah masuk ke latar belakang, BGTaskScheduler memungkinkan menjadwalkan eksekusi tugas di masa depan — misalnya, memperbarui konten sekali per jam atau mengunggah analitik di malam hari. BGTaskScheduler adalah pendekatan yang direkomendasikan untuk proyek baru karena lebih efisien dalam hal baterai.

swift
import UIKit
import BackgroundTasks

@main
class AppDelegate: UIResponder, UIApplicationDelegate {

    var backgroundTaskID: UIBackgroundTaskIdentifier = .invalid

    // Aplikasi masuk ke latar belakang — memulai tugas latar belakang
    func applicationDidEnterBackground(_ application: UIApplication) {
        saveAppState()
        startBackgroundTask()
    }

    private func startBackgroundTask() {
        backgroundTaskID = UIApplication.shared.beginBackgroundTask { [weak self] in
            // Waktu habis — memaksa penghentian
            self?.endBackgroundTask()
        }

        // Simulasi kerja latar belakang (menyimpan data ke server)
        DispatchQueue.global().async { [weak self] in
            uploadAnalyticsData()
            self?.endBackgroundTask()
        }
    }

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

    // Pendaftaran BGTaskScheduler
    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)
        }
    }
}

Kode menunjukkan pemrosesan Background lengkap di iOS. applicationDidEnterBackground memulai tugas latar belakang melalui beginBackgroundTask dengan batas waktu dan expirationHandler. Secara paralel, BGTaskScheduler didaftarkan untuk pembaruan konten periodik. beginBackgroundTask digunakan untuk penyelesaian pekerjaan segera, BGTaskScheduler — untuk perencanaan jangka panjang. Kedua API memerlukan pengelolaan pengidentifikasi tugas yang benar.

Background di Android: Kotlin, Service, WorkManager

Di Android Background dikelola melalui beberapa API. Service tradisional memungkinkan menjalankan kode di latar belakang, tetapi sejak Android 8+ (API 26) Background Service dibatasi: sistem mengakhirinya beberapa menit setelah aplikasi masuk ke latar belakang. Foreground Service dengan notifikasi permanen dapat bekerja tanpa batas. WorkManager — solusi yang direkomendasikan untuk tugas latar belakang dengan jaminan eksekusi bahkan setelah perangkat di-restart.

Android, tidak seperti iOS, mendukung proses latar belakang yang berumur panjang. Foreground Service digunakan untuk tugas yang harus dilihat pengguna — pemutaran musik, navigasi, perekaman latihan. JobScheduler dan WorkManager — untuk tugas yang dapat ditunda: sinkronisasi data, unggah log, pembaruan cache. Perbedaan utama: Android memungkinkan menjadwalkan tugas dengan kondisi — Wi-Fi, pengisian daya, ketidakaktifan perangkat, yang menghemat baterai dan lalu lintas.

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

// 1. Foreground Service untuk kerja latar belakang panjang
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 {
            // Sinkronisasi data dengan server
            syncDataToServer()
            stopForeground(STOP_FOREGROUND_REMOVE)
            stopSelf()
        }.start()
    }

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

// 2. WorkManager untuk tugas latar belakang yang ditunda
class DataSyncWorker(
    private val context: Context,
    private val params: WorkerParameters
) : CoroutineWorker(context, params) {

    override suspend fun doWork(): Result {
        return try {
            // Unggah analitik ke server
            uploadAnalytics()
            Result.success()
        } catch (e: Exception) {
            if (runAttemptCount < 3) Result.retry() else Result.failure()
        }
    }
}

// Penjadwalan tugas WorkManager
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)
}

Kode menunjukkan dua pendekatan untuk kerja latar belakang di Android. SyncService — Foreground Service dengan notifikasi untuk kerja latar belakang segera dan panjang. DataSyncWorker — WorkManager untuk tugas yang ditunda dengan kondisi (Wi-Fi, pengisian daya). WorkManager menjamin eksekusi bahkan setelah perangkat di-restart dan mendukung exponential backoff untuk percobaan ulang. Foreground Service memerlukan notifikasi permanen di bilah status.

Batasan kerja latar belakang di iOS dan Android

Kedua platform mobile terus memperketat aturan kerja latar belakang. Di iOS setiap generasi baru sistem operasi mengurangi waktu kerja latar belakang dan menambahkan batasan baru. Di Android Google memperkenalkan mode hemat energi yang semakin ketat (Doze, App Standby). Pengembang harus mengetahui batasan saat ini agar aplikasi tidak diakhiri sebelum waktunya oleh sistem.

Di iOS mulai dari iOS 13, sistem menonaktifkan tugas latar belakang untuk aplikasi yang menyalahgunakan waktu latar belakang. Setiap aplikasi mendapatkan batasan tertentu berdasarkan perilaku pengguna. BGTaskScheduler menjadwalkan eksekusi pada waktu optimal — misalnya, ketika perangkat terhubung ke Wi-Fi dan sedang diisi daya. Aplikasi yang menggunakan BGTaskScheduler dengan benar mendapatkan lebih banyak waktu latar belakang.

Di Android mulai dari Android 9 (API 28) kerja latar belakang dibatasi oleh mode Doze, yang diaktifkan saat perangkat tidak aktif. Aplikasi dalam Doze tidak dapat menjalankan tugas latar belakang, jaringan dimatikan, JobScheduler dan WorkManager menunda tugas hingga keluar dari Doze. Foreground Service adalah satu-satunya cara untuk melewati Doze, tetapi penyalahgunaan menyebabkan pemblokiran aplikasi oleh pengguna dan penghapusan izin.

BatasaniOSAndroid
Batas waktu tugas latar belakang~30 detik (beginBackgroundTask)Beberapa menit (JobScheduler)
Latar belakang tanpa batasAudio, VoIP, navigasi, BluetoothForeground Service + notifikasi
Hemat energiLow Power Mode — nonaktifkan tugas latar belakangDoze, App Standby, Battery Optimization
PenjadwalanBGTaskScheduler (iOS 13+)WorkManager (Android Jetpack)
Setelah restartHanya notifikasi pushWorkManager menyimpan tugas
Waktu eksekusi maks.~30 menit (audio)Tanpa batas (Foreground Service)

Praktik terbaik kerja latar belakang

Aturan pertama — minimalkan konsumsi sumber daya di latar belakang. Sebagian besar tugas latar belakang dapat ditunda hingga perangkat diisi daya dan terhubung ke Wi-Fi. Gunakan BGTaskScheduler (iOS) dan WorkManager (Android) untuk menjadwalkan tugas dengan kondisi. Jangan menjalankan komputasi berat di latar belakang — ini menghabiskan baterai dan menyebabkan throttling CPU.

Aturan kedua — selalu tentukan expirationHandler untuk beginBackgroundTask. Jika aplikasi tidak menyelesaikan tugas dalam waktu yang ditentukan, sistem akan memindahkannya secara paksa ke Suspended atau mengakhirinya. ExpirationHandler adalah kesempatan terakhir untuk menyimpan data dan menyelesaikan pekerjaan dengan benar. Di Android gunakan setForegroundAsync di WorkManager untuk mengubah tugas biasa menjadi foreground jika diperlukan lebih banyak waktu.

Aturan ketiga — periksa batasan kerja latar belakang sebelum memulai. Di iOS gunakan UIApplication.shared.backgroundTimeRemaining untuk memeriksa sisa waktu. Di Android periksa ActivityManager.isBackgroundRestricted() — jika true, aplikasi tidak akan dapat menjalankan tugas latar belakang dan perlu menyarankan pengguna untuk menghapus batasan di pengaturan. Ini sangat penting untuk aplikasi dengan fungsi latar belakang kritis — alarm, kalender, sinkronisasi.

Aturan keempat — uji tugas latar belakang pada perangkat nyata. Simulator dan emulator tidak mereproduksi batasan kerja latar belakang yang sebenarnya. Di iOS gunakan Debug → Simulate Background Fetch di Xcode. Di Android — adb shell am broadcast -a android.intent.action.ACTION_BOOT_COMPLETED untuk menguji WorkManager setelah restart. Pengujian nyata pada perangkat dengan daya baterai rendah mengungkapkan sebagian besar masalah kerja latar belakang.

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("Sisa waktu di latar belakang: \(remaining) detik")

        let task = UIApplication.shared.beginBackgroundTask { [weak self] in
            print("Waktu habis untuk tugas: \(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)
    }
}

Kode menunjukkan manajer tugas latar belakang yang melacak sisa waktu dan mengelola pengidentifikasi. backgroundTimeRemaining mengembalikan jumlah detik hingga penghentian paksa — jika nilai tidak terbatas, aplikasi bekerja tanpa batasan (audio, navigasi). Manajer memungkinkan menjalankan beberapa tugas latar belakang dengan nama berbeda dan menyelesaikan masing-masing dengan benar. Pendekatan ini mencegah kebocoran tugas latar belakang dan menjamin bahwa sistem tidak akan mengakhiri aplikasi karena tugas yang belum ditutup.

Pertanyaan yang sering diajukan

Bisakah aplikasi iOS bekerja di latar belakang selamanya?

Ya, untuk sejumlah kategori terbatas: audio (AVAudioSession kategori .playback), VoIP (PushKit), navigasi (CLLocationManager dengan allowsBackgroundLocationUpdates), Bluetooth (mode latar belakang sentral), pembaruan latar belakang (BGTaskScheduler). Untuk semua lainnya — maksimum 30 detik. Di iOS 16+ Apple telah memperketat persyaratan bahkan untuk kategori yang diizinkan.

Apa perbedaan beginBackgroundTask dengan BGTaskScheduler?

beginBackgroundTask — API sinkron untuk memperpanjang umur aplikasi ~30 detik setelah masuk ke latar belakang. Dipanggil di applicationDidEnterBackground. BGTaskScheduler — API asinkron untuk menjadwalkan tugas di masa depan melalui pemicu sistem (waktu, lokasi, pembaruan konten). BGTaskScheduler adalah pendekatan modern yang direkomendasikan Apple untuk iOS 13+.

Mengapa Android mematikan Background Service saya?

Mulai Android 8 (API 26), Background Service diakhiri beberapa menit setelah aplikasi masuk ke latar belakang. Solusi: gunakan Foreground Service dengan notifikasi untuk operasi panjang atau WorkManager untuk tugas yang ditunda. Periksa Battery Optimization untuk aplikasi Anda di pengaturan — jika dioptimalkan, sistem dapat menunda atau membatalkan tugas latar belakang.

Bagaimana cara menguji Background di simulator iOS?

Tekan Cmd+Shift+H untuk pergi ke Layar Beranda. Di Xcode gunakan Debug → Simulate Background Fetch. Untuk memeriksa beginBackgroundTask buka konsol (Shift+Cmd+C) dan panggil e UIApplication.shared.backgroundTimeRemaining. Di Xcode 15+ tersedia skenario Background Execution di tab Diagnostics simulator.

Apa itu process death di Android?

Process Death — penghentian proses Android oleh sistem saat kekurangan sumber daya atau saat tidak aktif di latar belakang. Tidak seperti iOS, Android tidak memiliki Suspended — proses hidup (bisa di latar belakang) atau mati (Not Running). Process Death adalah perilaku normal sistem operasi dan aplikasi harus memulihkan status setelahnya dengan benar melalui SavedStateHandle, onSaveInstanceState atau DataStore.

Ringkasan

  • Background — aplikasi tidak terlihat di layar tetapi menjalankan kode, tidak seperti Suspended (dibekukan)
  • iOS — beginBackgroundTask (hingga 30 detik) dan BGTaskScheduler untuk menjadwalkan tugas masa depan
  • Android — Foreground Service untuk operasi panjang, WorkManager untuk tugas ditunda dengan jaminan
  • Batasan — kedua platform memperketat aturan kerja latar belakang: Doze, Low Power Mode, App Standby
  • Penyimpanan — applicationDidEnterBackground dan onStop — kesempatan terakhir menyimpan data sebelum Suspended/Not Running
  • Penjadwalan — BGTaskScheduler dan WorkManager bekerja dengan kondisi (Wi-Fi, pengisian daya, waktu)
  • Foreground Service — satu-satunya cara kerja latar belakang tanpa batas di kedua platform

Kami akan mengembangkan aplikasi seluler turnkey

IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.

Diskusikan proyek

Baca juga