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:
| State | Yang boleh dilakukan | Yang harus dihindari |
|---|---|---|
| Created | Inisialisasi view, restore savedInstanceState | Jangan lakukan operasi berat |
| Started | Resource sudah siap, UI belum interaktif | Jangan minta input pengguna |
| Resumed | UI sepenuhnya interaktif | Hindari blocking thread |
| Paused | UI sebagian tertutup dialog | Jangan simpan ke disk di sini |
| Stopped | Tidak terlihat pengguna | Bebaskan resource berat |
| Destroyed | Cleanup akhir | Jangan 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:
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.
// 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:
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=DESTROYEDMari kita amati tiga titik penting dari output:
- 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.
- Pasangan Home dan kembali hanya melewati
onPause -> onStopdanonStart -> onResume, tanpaonDestroy. State Activity tetap utuh. - 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 #
- Understand the Activity lifecycle
— panduan resmi Activity lifecycle Android:
onCreate,onStart,onResume, hinggaonDestroy
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.