App Lifecycle: apa itu, status aplikasi di iOS dan Android

Penulis: IT Sectr Diterbitkan: 2026-03-02 Waktu membaca: 8 mnt
App Lifecycle (siklus hidup aplikasi) — urutan status yang dilalui aplikasi seluler dari peluncuran hingga selesai. Memahami lifecycle sangat penting untuk manajemen sumber daya, penyimpanan data, dan memastikan stabilitas. Di iOS aplikasi melewati status: Not Running → Active → Inactive → Background → Suspended. Di Android — melalui onCreate → onStart → onResume → onPause → onStop → onDestroy + onRestart. Setiap status memberi pengembang kesempatan untuk menyimpan status, membebaskan sumber daya, atau mempersiapkan kembali. Menurut Apple Documentation, mengabaikan peristiwa lifecycle adalah penyebab 40% crash saat meminimalkan aplikasi. Di IT Sectr kami menerapkan ProcessLifecycleOwner di Android dan template AppDelegate di iOS sebagai standar wajib untuk semua proyek — ini mengurangi jumlah bug terkait latar belakang sebesar 60%.

Poin Utama

  • App Lifecycle — kumpulan status aplikasi: dari peluncuran hingga selesai, masing-masing dengan tindakan pengembang tertentu.
  • AppDelegate — kelas sentral iOS untuk pemrosesan lifecycle: didFinishLaunching, didEnterBackground, willEnterForeground.
  • SceneDelegate — delegat adegan individu (iOS 13+), mengelola lifecycle setiap jendela di aplikasi multi-jendela.
  • ProcessLifecycleOwner — komponen Android dari AndroidX Lifecycle, melacak lifecycle seluruh proses.
  • Application.onCreate — titik masuk pertama aplikasi Android, dipanggil sebelum Activity apa pun.

Apa itu App Lifecycle?

App Lifecycle — mesin status terbatas yang menggambarkan semua kemungkinan status aplikasi seluler dan transisi di antaranya. Setiap status menentukan apakah aplikasi dapat mengeksekusi kode, menampilkan UI, dan mengonsumsi sumber daya. iOS dan Android memiliki model yang serupa tetapi tidak identik — perbedaan disebabkan oleh arsitektur OS: iOS menggunakan kontrol memori ketat (status suspended), Android — manajemen proses fleksibel melalui onSaveInstanceState.

Di iOS lifecycle terikat erat dengan foreground/background: aplikasi baik aktif atau ditangguhkan. Di Android lifecycle lebih granular — Activity/Window melewati 6+ status, dan proses itu sendiri memiliki lifecycle tambahan melalui ProcessLifecycleOwner. Aplikasi modern (sejak 2024) semakin banyak menggunakan pola arsitektur berbasis lifecycle: SwiftUI Lifecycle (iOS 16+) melalui .scenePhase environment, Compose Lifecycle melalui LifecycleEventObserver. Pola-pola ini secara otomatis menangani peralihan konteks dan mencegah kebocoran memori. Menurut Google, pemrosesan lifecycle yang benar di Android mengurangi konsumsi memori sebesar 30–40% selama kerja latar belakang.

Siklus Hidup iOS: AppDelegate dan SceneDelegate

Di iOS lifecycle aplikasi dikelola melalui kelas UIApplicationDelegate (AppDelegate). Metode utama: application(_:didFinishLaunchingWithOptions:) — inisialisasi saat pertama kali dijalankan; applicationDidBecomeActive — aplikasi terlihat dan siap berinteraksi; applicationWillResignActive — transisi ke status tidak aktif (panggilan masuk, menutup tirai); applicationDidEnterBackground — aplikasi tersembunyi, ada ~5 detik untuk menyimpan data; applicationWillEnterForeground — kembali dari latar belakang; applicationWillTerminate — penghentian (hanya dipanggil untuk aplikasi lama tanpa suspended).

Mulai iOS 13, Apple memperkenalkan SceneDelegate (UISceneDelegate) untuk mendukung aplikasi multi-jendela di iPad dan macOS Catalyst. SceneDelegate mengelola lifecycle setiap adegan (jendela) secara terpisah: scene(_:willConnectTo:options:) — pembuatan adegan; sceneDidBecomeActive — adegan aktif; sceneWillResignActive — adegan kehilangan fokus; sceneDidEnterBackground — adegan tersembunyi. AppDelegate bertanggung jawab atas peristiwa global (memuat data, notifikasi push), dan SceneDelegate — untuk status UI setiap jendela. Di SwiftUI lifecycle dikelola melalui nilai lingkungan @Environment(\.scenePhase): .active, .inactive, .background — ini menyediakan API terpadu untuk aplikasi SwiftUI dan UIKit.

Siklus Hidup Android: Application dan ProcessLifecycleOwner

Di Android lifecycle dimulai dengan kelas Application — singleton yang dibuat sebelum Activity apa pun. Metode Application.onCreate() — titik masuk pertama, digunakan untuk inisialisasi global (Analytics, DI, Crash Reporting). Setelah itu Activity diluncurkan dengan urutan: onCreate() → onStart() → onResume(). Saat diminimalkan: onPause() → onStop() → onSaveInstanceState(). Saat dihancurkan: onDestroy(). Saat kembali: onRestart() → onStart() → onResume().

ProcessLifecycleOwner (dari AndroidX Lifecycle 2.2+) melacak lifecycle seluruh proses, bukan Activity individu. Menyediakan dua status: ON_RESUME (aplikasi di foreground) dan ON_STOP (aplikasi tersembunyi). ProcessLifecycleOwner memecahkan masalah "kapan aplikasi pergi ke latar belakang" di tingkat proses — ini penting untuk SDK, perpustakaan, dan aplikasi modular. Di Jetpack Compose lifecycle dikelola melalui LifecycleEventObserver dan collectAsStateWithLifecycle, yang secara otomatis menjeda pengumpulan data dalam mode latar belakang. Android 14 (API 34) menambahkan notifikasi tentang foreground service lifecycle melalui Service.onTimeout — layanan harus selesai dalam 6 jam, jika tidak sistem akan menghentikannya secara paksa.

Perbandingan lifecycle iOS dan Android

iOSAndroidDeskripsi
Not RunningAplikasi tidak berjalan
didFinishLaunchingApplication.onCreateInisialisasi pertama saat startup
ActiveonResumeAplikasi terlihat dan menerima input
InactiveonPauseKehilangan fokus sementara (panggilan, tirai)
BackgroundonStopAplikasi tersembunyi, kode dapat dieksekusi
SuspendedKode tidak dieksekusi, memori dicadangkan
Will TerminateonDestroyAplikasi dihentikan

Perbedaan utama: iOS memaksa aplikasi ke Suspended (kode tidak dieksekusi) 5-10 detik setelah masuk ke latar belakang. Android mengizinkan kerja latar belakang (layanan, WorkManager) untuk waktu yang lebih lama, tetapi dengan batasan Doze Mode (Android 6+) dan batasan latar belakang (Android 12+). ProcessLifecycleOwner di Android — analog UIApplicationDidEnterBackgroundNotification di iOS dengan perbedaan bahwa ia dipicu pada setiap transisi ke latar belakang, bukan hanya setelah kehilangan fokus.

Contoh Kode

iOS: AppDelegate dengan metode lifecycle

Implementasi dasar AppDelegate dengan penanganan semua status siklus hidup. Menyimpan data saat transisi ke latar belakang dan memperbarui UI saat kembali.

swift
import UIKit
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
    func application(_: UIApplication, didFinishLaunchingWithOptions lo: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { Analytics.shared.initialize(); return true }
    func applicationDidBecomeActive(_: UIApplication) { NotificationCenter.default.post(name: .appDidBecomeActive, object: nil) }
    func applicationWillResignActive(_: UIApplication) { NotificationCenter.default.post(name: .appWillResignActive, object: nil) }
    func applicationDidEnterBackground(_: UIApplication) { CoreDataManager.shared.saveContext(); UserDefaults.standard.synchronize() }
    func applicationWillEnterForeground(_: UIApplication) { NetworkManager.shared.refreshSession() }
}

AppDelegate — titik pusat lifecycle. applicationDidEnterBackground — metode kritis: iOS memberi ~5 detik untuk menyimpan data. applicationDidBecomeActive — perbarui UI, mulai ulang animasi. Untuk SceneDelegate (iOS 13+) logika lifecycle didistribusikan ke adegan: sceneDidBecomeActive / sceneDidEnterBackground mengelola jendela individual.

iOS: SceneDelegate (iOS 13+)

SceneDelegate untuk aplikasi multi-jendela iPad. Setiap adegan memiliki lifecycle sendiri, independen dari jendela lain.

swift
import UIKit
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
    var window: UIWindow?
    func scene(_: UIScene, willConnectTo s: UISceneSession, options o: UIScene.ConnectionOptions) {
        guard let ws = (_ as? UIWindowScene) else { return }
        window = UIWindow(windowScene: ws)
        window?.rootViewController = ViewController()
        window?.makeKeyAndVisible()
    }
    func sceneDidBecomeActive(_: UIScene) { PlayerManager.shared.resume() }
    func sceneDidEnterBackground(_: UIScene) { PlayerManager.shared.pause(); CoreDataManager.shared.saveContext() }
    func sceneDidDisconnect(_: UIScene) { PlayerManager.shared.cleanup() }
}

SceneDelegate mengelola lifecycle adegan individu. sceneDidBecomeActive / sceneDidEnterBackground — setara dengan metode AppDelegate untuk jendela tertentu. sceneDidDisconnect dipanggil saat adegan ditutup (pengguna menutup jendela di iPad). Untuk menjaga kompatibilitas dengan iOS 12 dan lebih lama, AppDelegate harus menduplikasi logika SceneDelegate. Di iOS 17+ Anda dapat menggunakan @Observable untuk menjeda/melanjutkan tugas secara otomatis berdasarkan scenePhase.

Android: Application dengan ProcessLifecycleOwner

ProcessLifecycleOwner melacak kapan aplikasi berada di foreground/background di tingkat proses. Ini adalah cara optimal untuk manajemen lifecycle global.

kotlin
import android.app.Application
import androidx.lifecycle.ProcessLifecycleOwner
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleObserver
import androidx.lifecycle.OnLifecycleEvent
class MainApplication : Application() {
    override fun onCreate() { super.onCreate(); ProcessLifecycleOwner.get().lifecycle.addObserver(AppLifecycleObserver()) }
}
class AppLifecycleObserver : LifecycleObserver {
    @OnLifecycleEvent(Lifecycle.Event.ON_START) fun onEnterForeground() { Analytics.shared.onForeground(); NetworkMonitor.shared.start() }
    @OnLifecycleEvent(Lifecycle.Event.ON_STOP) fun onEnterBackground() { Analytics.shared.onBackground(); NetworkMonitor.shared.stop() }
}

ProcessLifecycleOwner — satu-satunya cara yang benar untuk melacak transisi ke latar belakang di tingkat aplikasi. ON_START dipicu saat aplikasi menjadi terlihat (foreground), ON_STOP — saat sepenuhnya tersembunyi (background). Tidak seperti Activity lifecycle, ProcessLifecycleOwner tidak terikat pada layar tertentu. Untuk Jetpack Compose gunakan LifecycleResumeEffect atau collectAsStateWithLifecycle sebagai pengganti pengamatan manual.

Android: Activity Lifecycle dengan ViewModel

ViewModel + Lifecycle — arsitektur Android yang benar untuk bekerja dengan lifecycle. ViewModel secara otomatis dibersihkan saat onDestroy, mencegah kebocoran memori.

kotlin
import androidx.lifecycle.ViewModel
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
class TimerViewModel : ViewModel() {
    private val _time = MutableLiveData<Long>()
    val time: LiveData<Long> = _time
    private var startTime = System.currentTimeMillis()
    init { updateTime() }
    private fun updateTime() { _time.value = System.currentTimeMillis() - startTime }
    override fun onCleared() { super.onCleared(); Logger.d("ViewModel cleared — membebaskan sumber daya") }
}
// Di Activity
class TimerActivity : AppCompatActivity() {
    private val viewModel: TimerViewModel by viewModels()
    override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState); Logger.d("Activity created") }
    override fun onResume() { super.onResume(); viewModel.time.observe(this) { Logger.d("Time: $it") } }
    override fun onPause() { super.onPause(); Logger.d("Activity paused — menjeda animasi") }
    override fun onDestroy() { super.onDestroy(); Logger.d("Activity destroyed — pembersihan") }
}

ViewModel bertahan dari rotasi layar dan hanya dihancurkan saat finish() Activity. onCleared() — tempat untuk membebaskan sumber daya, berhenti berlangganan dari aliran. LiveData secara otomatis menjeda pengamatan saat onPause dan melanjutkan saat onResume — memberikan perlindungan terhadap kebocoran dan crash selama kerja latar belakang. Di Compose gunakan collectAsStateWithLifecycle() untuk tujuan yang sama.

Pertanyaan yang Sering Diajukan

Apa yang terjadi ketika pengguna meminimalkan aplikasi iOS?

Saat meminimalkan, aplikasi beralih dari active ke inactive (sebentar), lalu ke background. Setelah beberapa detik sistem dapat memindahkannya ke suspended — kode tidak dieksekusi, memori dicadangkan. Saat kekurangan memori, aplikasi suspended dihentikan (willTerminate tidak dipanggil). Simpan data di applicationDidEnterBackground — ini adalah titik jaminan terakhir untuk penyimpanan.

Apakah perlu menangani semua status App Lifecycle?

Minimal wajib: applicationDidEnterBackground — simpan data pengguna; applicationWillEnterForeground — perbarui UI; di Android onPause — jeda animasi/sensor. ProcessLifecycleOwner menyederhanakan penanganan: onResume — onPause untuk foreground, onStart — onStop untuk visibilitas. Status lainnya tangani sesuai kebutuhan — tidak semua status kritis untuk setiap aplikasi.

Apa perbedaan SceneDelegate dengan AppDelegate?

AppDelegate — delegat global seluruh aplikasi (peluncuran, transisi latar belakang). SceneDelegate (iOS 13+) mengelola lifecycle jendela individu (adegan) — di aplikasi multi-jendela iPad setiap adegan memiliki lifecycle sendiri. Untuk iOS 12 dan lebih lama, seluruh lifecycle ditangani melalui AppDelegate. Mulai iPadOS 16+ SceneDelegate wajib untuk Stage Manager.

Apa itu ProcessLifecycleOwner di Android?

ProcessLifecycleOwner — komponen dari AndroidX Lifecycle yang melacak lifecycle seluruh aplikasi (proses), bukan Activity individu. Menyediakan dua peristiwa utama: ON_RESUME (aplikasi di foreground) dan ON_STOP (aplikasi di background). Digunakan untuk inisialisasi/pembersihan SDK, analitik, monitor jaringan — semua yang harus bereaksi terhadap transisi aplikasi ke latar belakang, terlepas dari layar saat ini.

Bagaimana cara mengelola lifecycle di Jetpack Compose?

Di Jetpack Compose gunakan LifecycleEventObserver melalui LocalLifecycleOwner.current.lifecycle atau fungsi collectAsStateWithLifecycle(). Untuk layar Compose terapkan LifecycleResumeEffect — analog DisposableEffect yang berjalan saat onResume dan dibersihkan saat onPause. lifecycleScope.launchWhenResumed — korutin yang secara otomatis dijeda di latar belakang.

Ringkasan

  • App Lifecycle — mesin status terbatas aplikasi yang menentukan manajemen sumber daya, penyimpanan data, dan stabilitas.
  • iOS AppDelegate (applicationDidEnterBackground) — metode kritis untuk menyimpan data saat transisi latar belakang dalam 5 detik.
  • iOS SceneDelegate (iOS 13+) mengelola lifecycle setiap adegan secara terpisah — wajib untuk aplikasi multi-jendela iPad.
  • Android ProcessLifecycleOwner — pengamat global lifecycle proses untuk inisialisasi/pembersihan SDK.
  • ViewModel di Android bertahan dari rotasi layar dan dibersihkan saat finish Activity — mencegah kebocoran memori.
  • SwiftUI @Environment(\.scenePhase) — API terpadu untuk lifecycle di SwiftUI (active, inactive, background).
  • Penanganan lifecycle yang benar mengurangi konsumsi memori sebesar 30-40% dan mencegah 40% crash selama kerja latar belakang.

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