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 — 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.
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).
| Karakteristik | iOS Background | Android Background |
|---|---|---|
| Kode dijalankan | Ya, hingga 30 detik | Ya, tergantung API |
| UI terlihat | Tidak | Tidak |
| Batas waktu default | ~30 detik (beginBackgroundTask) | Beberapa menit (Service) |
| Kerja tanpa batas | Hanya kategori khusus (audio, VoIP, navigasi) | Foreground Service dengan notifikasi |
| Jaminan eksekusi | Tidak — sistem dapat mengakhiri kapan saja | WorkManager menjamin eksekusi |
| Memerlukan izin | Ya — capabilities di Info.plist | Ya — izin FOREGROUND_SERVICE |
| Status berikutnya | Suspended → Not Running | Not Running (atau restart) |
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.
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.
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.
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.
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.
| Batasan | iOS | Android |
|---|---|---|
| Batas waktu tugas latar belakang | ~30 detik (beginBackgroundTask) | Beberapa menit (JobScheduler) |
| Latar belakang tanpa batas | Audio, VoIP, navigasi, Bluetooth | Foreground Service + notifikasi |
| Hemat energi | Low Power Mode — nonaktifkan tugas latar belakang | Doze, App Standby, Battery Optimization |
| Penjadwalan | BGTaskScheduler (iOS 13+) | WorkManager (Android Jetpack) |
| Setelah restart | Hanya notifikasi push | WorkManager menyimpan tugas |
| Waktu eksekusi maks. | ~30 menit (audio) | Tanpa batas (Foreground Service) |
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.
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
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.
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+.
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.
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.
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
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.
Baca juga