Activity adalah salah satu komponen yang memiliki siklus hidup paling kompleks di Android. Sistem operasi dapat menjeda, menghentikan, memutar ulang, atau mengganggu Activity kapan saja tergantung interaksi pengguna dan tekanan memori. Memahami urutan callback (onCreate, onStart, onResume, onPause, onStop, onDestroy) menentukan apakah aplikasi kita akan mulus dirotasi, atau justru kehilangan state pengguna. Bab ini membongkar setiap state dan menunjukkan skenario nyata: rotasi layar, menekan Home, kembali ke aplikasi, dan menekan Back untuk keluar.

State dan Callback #

Sistem operasi mengelola Activity melalui mesin state berikut:

Setiap state memiliki arti praktis:

StateYang boleh dilakukanYang harus dihindari
CreatedInisialisasi view, restore savedInstanceStateJangan lakukan operasi berat
StartedResource sudah siap, UI belum interaktifJangan minta input pengguna
ResumedUI sepenuhnya interaktifHindari blocking thread
PausedUI sebagian tertutup dialogJangan simpan ke disk di sini
StoppedTidak terlihat penggunaBebaskan resource berat
DestroyedCleanup akhirJangan referensi Activity dari singleton

Override Callback di Kotlin #

Pada Kotlin, override callback dilakukan dengan menandai method dengan override dan memanggil implementasi superclass. Bentuk paling ringkasnya:

kotlin Contoh override onCreate dan onResume
class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent { HalamanUtama() }
    }

    override fun onResume() {
        super.onResume()
        // mulai polling data atau langgani observer
    }

    override fun onPause() {
        super.onPause()
        // hentikan polling atau lepaskan observer
    }
}

Pola yang paling penting: pasangan onResume / onPause untuk resource yang hanya relevan saat UI terlihat (mis. kamera, polling lokasi), dan pasangan onStart / onStop untuk resource yang boleh tetap aktif walau Activity terhalang dialog. Setiap aktivasi harus punya satu titik pematangan — bila tidak, terjadi kebocoran resource.

Simulasi Skenario Lifecycle #

Cuplikan berikut memodelkan Activity sebagai state machine yang mencatat setiap callback ke buffer. Skenario yang dijalankan: peluncuran awal, rotasi layar (yang menyebabkan destroy lalu re-create), menekan Home, kembali ke aplikasi, dan menekan Back.

kotlin
// activity_lifecycle.kt
// Mensimulasikan Activity lifecycle Android sebagai state machine ringkas.
// Setiap callback (onCreate, onStart, onResume, onPause, onStop, onDestroy)
// dicatat ke buffer sehingga urutan eksekusi terlihat deterministik.

enum class LifecycleState {
    CREATED, STARTED, RESUMED, PAUSED, STOPPED, DESTROYED
}

class ActivitySimulasi(private val nama: String) {
    private val log = mutableListOf<String>()
    var state: LifecycleState? = null
        private set

    fun onCreate() { state = LifecycleState.CREATED; log("onCreate") }
    fun onStart() { state = LifecycleState.STARTED; log("onStart") }
    fun onResume() { state = LifecycleState.RESUMED; log("onResume") }
    fun onPause() { state = LifecycleState.PAUSED; log("onPause") }
    fun onStop() { state = LifecycleState.STOPPED; log("onStop") }
    fun onDestroy() { state = LifecycleState.DESTROYED; log("onDestroy") }

    private fun log(callback: String) { log.add("$nama.$callback -> state=$state") }

    fun dumpLog(): List<String> = log.toList()
}

object LifecycleScenario {
    fun rotasiLayar(activity: ActivitySimulasi) {
        // Rotasi layar memicu onPause -> onStop -> onDestroy -> onCreate baru
        activity.onPause()
        activity.onStop()
        activity.onDestroy()
        activity.onCreate()
        activity.onStart()
        activity.onResume()
    }

    fun penggunaMenekanHome(activity: ActivitySimulasi) {
        activity.onPause()
        activity.onStop()
    }

    fun penggunaKembali(activity: ActivitySimulasi) {
        activity.onStart()
        activity.onResume()
    }
}

fun main() {
    val a = ActivitySimulasi("MainActivity")
    a.onCreate(); a.onStart(); a.onResume()
    println("Skenario 1: rotasi layar")
    LifecycleScenario.rotasiLayar(a)
    println("Skenario 2: tekan Home lalu kembali")
    LifecycleScenario.penggunaMenekanHome(a)
    LifecycleScenario.penggunaKembali(a)
    println("Skenario 3: tekan Back untuk keluar")
    a.onPause(); a.onStop(); a.onDestroy()
    println("State akhir: ${a.state}")
    println("Urutan callback (${a.dumpLog().size} langkah):")
    a.dumpLog().forEach { println("  $it") }
}

Output yang Dihasilkan:

text
Skenario 1: rotasi layar
Skenario 2: tekan Home lalu kembali
Skenario 3: tekan Back untuk keluar
State akhir: DESTROYED
Urutan callback (16 langkah):
  MainActivity.onCreate -> state=CREATED
  MainActivity.onStart -> state=STARTED
  MainActivity.onResume -> state=RESUMED
  MainActivity.onPause -> state=PAUSED
  MainActivity.onStop -> state=STOPPED
  MainActivity.onDestroy -> state=DESTROYED
  MainActivity.onCreate -> state=CREATED
  MainActivity.onStart -> state=STARTED
  MainActivity.onResume -> state=RESUMED
  MainActivity.onPause -> state=PAUSED
  MainActivity.onStop -> state=STOPPED
  MainActivity.onStart -> state=STARTED
  MainActivity.onResume -> state=RESUMED
  MainActivity.onPause -> state=PAUSED
  MainActivity.onStop -> state=STOPPED
  MainActivity.onDestroy -> state=DESTROYED

Mari kita amati tiga titik penting dari output:

  1. Rotasi layar memicu destroy lalu create. Inilah mengapa data view yang disimpan di variabel lokal Activity akan hilang saat layar diputar — sistem operasi membuat instance Activity baru.
  2. Pasangan Home dan kembali hanya melewati onPause -> onStop dan onStart -> onResume, tanpa onDestroy. State Activity tetap utuh.
  3. Back button menghasilkan onPause -> onStop -> onDestroy, sehingga instance Activity benar-benar selesai dan tidak bisa dipulihkan.

Menyimpan State lintas Rotasi #

Untuk mempertahankan data saat rotasi, kita memakai onSaveInstanceState(outState) yang dipanggil sebelum onStop. Data yang dapat di-Parcelable disimpan di Bundle, lalu dipulihkan di onCreate(savedInstanceState). Untuk data besar (mis. daftar panjang atau gambar), pindahkan ke ViewModel yang tetap hidup lintas rotasi — materi yang akan kita bahas tuntas pada chapter khusus.

Referensi Lanjutan #

Selanjutnya #

Lifecycle Activity mengatur transisi antar layar, tetapi bagaimana satu Activity memanggil Activity lain? Pertanyaan ini mengarah pada konsep Intent dan Navigation Component, yang akan kita bahas pada chapter Intents dan Navigation.