Activity Lifecycle adalah kumpulan metode callback yang dipanggil Android saat Activity bertransisi antar status: pembuatan, visibilitas, fokus input, kehilangan visibilitas sebagian, tersembunyi sepenuhnya, dan penghancuran. Sistem mengelola siklus hidup setiap layar aplikasi, mulai dari pemanggilan onCreate() hingga onDestroy. Memahami status-status ini adalah persyaratan wajib untuk stabilitas aplikasi Android, karena penanganan transisi antar metode yang salah menyebabkan kebocoran memori, kehilangan data pengguna, dan crash tak terduga. Baca lebih lanjut tentang arsitektur Android di artikel umum tentang Android.
Poin Penting
Activity Lifecycle (siklus hidup Activity) — adalah mesin status berhingga yang dilalui setiap layar aplikasi Android dari saat pembuatan hingga penghancuran total. Sistem Android mengelola proses ini berdasarkan tindakan pengguna: membuka aplikasi, meminimalkan, memutar layar, menjawab panggilan masuk, beralih antar aplikasi, dan mengakhiri.
Memahami siklus hidup sangat penting bagi setiap pengembang Android, karena sistem dapat menghancurkan Activity kapan saja saat memori tidak mencukupi — dan aplikasi wajib memulihkan statusnya dengan benar. Menurut Google Android Vitals (2025), aplikasi yang tidak menangani penyimpanan status di onSaveInstanceState() menunjukkan 42% lebih banyak crash saat pembuatan ulang Activity.
Siklus hidup mencakup enam metode callback utama: onCreate(), onStart(), onResume(), onPause(), onStop(), onDestroy(). Selain itu ada metode onRestart() yang dipanggil sebelum onStart() saat Activity kembali dari status terhenti. Setiap metode memiliki tujuan dan waktu eksekusi yang ditentukan secara ketat — sistem memanggilnya secara berurutan, dan pengembang dapat menimpa salah satunya untuk menjalankan logikanya sendiri.
Siklus dapat dibagi menjadi tiga tahap kunci: seluruh masa hidup (onCreate → onDestroy), masa hidup terlihat (onStart → onStop), dan masa hidup di latar depan (onResume → onPause). Memahami ketiga level ini membantu mendistribusikan kode inisialisasi dan pelepasan sumber daya dengan benar.
Setiap metode siklus hidup menjalankan tugas yang ditentukan secara ketat. Sistem memanggilnya dalam urutan tetap, dan pengembang hanya boleh menimpa metode yang diperlukan untuk logika tertentu. Tidak disarankan memanggil metode siklus hidup secara langsung — ini dilakukan oleh Android Runtime.
Urutan tipikal saat memulai aplikasi: onCreate → onStart → onResume. Saat menekan tombol “Kembali”: onPause → onStop → onDestroy. Saat meminimalkan: onPause → onStop, lalu saat kembali: onRestart → onStart → onResume.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
override fun onStart() {
super.onStart()
}
override fun onResume() {
super.onResume()
}
override fun onPause() {
super.onPause()
}
override fun onStop() {
super.onStop()
}
override fun onDestroy() {
super.onDestroy()
}
override fun onRestart() {
super.onRestart()
}
}
Setiap metode yang ditimpa wajib memanggil versi super — tanpa ini sistem tidak dapat menyelesaikan transisi antar status dengan benar. Aturan ini ditetapkan dalam dokumentasi Android Developers dan diperiksa oleh aturan lint Android Studio.
Level pertama — seluruh masa hidup (entire lifetime): interval antara onCreate dan onDestroy. Di sini dilakukan inisialisasi satu kali dan pelepasan akhir sumber daya global. Level kedua — masa hidup terlihat (visible lifetime): antara onStart dan onStop. Activity terlihat di layar, tetapi mungkin sebagian tertutup oleh jendela lain. Level ketiga — masa hidup di latar depan (foreground lifetime): antara onResume dan onPause. Activity berada di puncak tumpukan tugas dan berinteraksi dengan pengguna.
onCreate() — metode pertama dan satu-satunya yang wajib dari siklus hidup Activity. Ini dipanggil satu kali oleh sistem saat pembuatan instance Activity. Metode ini menerima parameter savedInstanceState: Bundle? yang berisi status yang disimpan sebelumnya, jika Activity dibuat ulang setelah penghancuran — misalnya, saat rotasi layar.
Di dalam onCreate, tugas-tugas berikut dilakukan: inisialisasi antarmuka pengguna melalui setContentView() dengan mengirimkan sumber daya layout, mengikat elemen View melalui findViewById(), mengatur adapter untuk RecyclerView dan ViewPager, memulihkan status dari savedInstanceState, inisialisasi ViewModel dan LiveData, mengatur listener klik dan gerakan. Metode harus selesai secepat mungkin — operasi panjang di sini memblokir render frame pertama, yang meningkatkan waktu mulai aplikasi.
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_profile)
val userNameText: TextView = findViewById(R.id.user_name)
val loadButton: Button = findViewById(R.id.load_button)
if (savedInstanceState != null) {
userNameText.text = savedInstanceState.getString("user_name")
}
loadButton.setOnClickListener {
loadUserProfile()
}
}
Jika Activity dibuat pertama kali, savedInstanceState sama dengan null. Saat dibuat ulang setelah rotasi layar, Bundle berisi data yang disimpan di onSaveInstanceState(). Pemeriksaan null adalah praktik standar untuk memulihkan UI dengan benar tanpa kehilangan data yang dimasukkan pengguna.
onStart() dipanggil segera setelah onCreate() atau setelah onRestart(), saat Activity menjadi terlihat oleh pengguna. Dalam status ini, Activity belum berada di latar depan dan tidak dapat berinteraksi dengan pengguna, tetapi antarmuka penggunanya sudah terlihat di layar. Misalnya, saat memulai aplikasi, antara panggilan onStart dan onResume, sistem merender frame pertama antarmuka.
Dalam metode onStart, biasanya dilakukan tindakan berikut: memulai animasi yang harus berjalan selama Activity terlihat; mengikat penerima siaran (BroadcastReceiver); terhubung ke layar geolokasi dan sensor; memperbarui data dari ViewModel atau Room. Di sini juga dilakukan pengikatan ke Bound-services melalui bindService(), jika aplikasi menggunakan arsitektur klien-server dalam proses.
override fun onStart() {
super.onStart()
val locationManager = getSystemService(Context.LOCATION_SERVICE) as LocationManager
locationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER,
5000L,
10f,
locationListener
)
}
override fun onStop() {
super.onStop()
val locationManager = getSystemService(Context.LOCATION_SERVICE) as LocationManager
locationManager.removeUpdates(locationListener)
}
Aturan penting: sumber daya yang terhubung di onStart harus dilepaskan di onStop. Ini memastikan bahwa saat Activity tidak terlihat di layar, ia tidak mengonsumsi baterai dan sumber daya sistem. Google Play Store memeriksa aplikasi untuk kebocoran LocationListener dan layanan sistem lainnya saat memoderasi pembaruan.
onResume() — status di mana Activity berada di latar depan dan siap berinteraksi dengan pengguna. Ini adalah status kerja layar: sistem memberikan fokus input ke Activity, dan semua peristiwa sentuhan, input keyboard, dan gerakan diarahkan ke layar ini. Metode onResume dipanggil setiap kali Activity kembali ke latar depan — setelah Activity lain selesai, setelah menutup dialog, setelah membuka kunci perangkat.
Di onResume dilakukan: melanjutkan animasi yang dijeda di onPause; membuka kamera dan sumber daya eksklusif lainnya; mendaftarkan listener sensor (akselerometer, giroskop); memulai timer dan stopwatch untuk UI; memperbarui konten layar dengan data terkini. Pasangan onResume / onPause digunakan untuk sumber daya yang hanya boleh aktif saat fokus — misalnya, pengenalan suara terus-menerus atau perekaman video.
override fun onResume() {
super.onResume()
cameraHolder.openCamera()
animator.resume()
sensorManager.registerListener(
stepCounter,
sensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER),
SensorManager.SENSOR_DELAY_NORMAL
)
}
override fun onPause() {
super.onPause()
cameraHolder.closeCamera()
animator.pause()
sensorManager.unregisterListener(stepCounter)
}
Perbedaan antara onStart dan onResume signifikan: Activity mungkin terlihat (onStart) tetapi tidak aktif (onResume) — misalnya, saat dialog pop-up atau layar kunci transparan ditampilkan di atasnya. Tepat di onResume, bukan di onStart, sumber daya eksklusif yang memerlukan akses monopolistik harus dibuka.
onPause() dipanggil saat Activity kehilangan fokus input, tetapi tetap terlihat sebagian. Skenario umum: membuka dialog, menekan tombol “Aplikasi Terbaru”, panggilan masuk, menekan tombol “Beranda” (dalam kasus ini setelah onPause akan menyusul onStop). Metode onPause adalah tempat terakhir yang andal untuk menyimpan data yang tidak boleh hilang oleh pengguna.
Di onPause dilakukan: menyimpan draf email dan formulir input di Room atau SharedPreferences; menghentikan animasi dan pemutaran video; menutup kamera dan melepaskan sumber daya monopolistik; membatalkan operasi mahal yang tidak penting untuk latar belakang. Metode onPause harus selesai dalam kurang dari 100 milidetik — sistem memblokir transisi ke Activity berikutnya sampai onPause mengembalikan kontrol, dan melebihi batas menyebabkan ANR (Application Not Responding).
override fun onPause() {
super.onPause()
val editor = SharedPreferences.Manager ...
editor.putString("draft_text", draftEditText.text.toString())
editor.apply()
videoView.pause()
cameraHolder.release()
}
Penting: onPause dijalankan di thread UI, oleh karena itu semua operasi pemblokiran, seperti menulis ke database melalui Room dengan kueri sinkron, harus diganti dengan asinkron (coroutine) atau dijalankan di thread latar belakang. Gunakan apply() daripada commit() untuk SharedPreferences — apply menulis data secara asinkron dan tidak memblokir thread UI.
onStop() dipanggil saat Activity tidak lagi terlihat oleh pengguna. Ini terjadi dalam kasus berikut: Activity sepenuhnya tertutup oleh Activity lain; pengguna menekan tombol “Beranda” atau beralih ke aplikasi lain; Activity sedang diakhiri (kemudian onDestroy akan dipanggil). Dalam status onStop, Activity tetap berada di memori dan mempertahankan semua field-nya — tidak dihancurkan, tetapi juga tidak aktif.
Di onStop dilakukan: berhenti berlangganan dari BroadcastReceiver yang terdaftar di onStart; memutuskan sambungan dari Bound-services; melepaskan LocationListener, SensorListener, dan listener sistem lainnya; menghentikan operasi latar belakang yang panjang yang tidak diperlukan saat aplikasi tersembunyi; menulis status UI saat ini ke Bundle melalui onSaveInstanceState(), jika ini belum dilakukan di onPause.
override fun onStop() {
super.onStop()
unregisterReceiver(connectivityReceiver)
unbindService(serviceConnection)
if (isChangingConfigurations()) {
Log.d("Lifecycle", "Activity dibuat ulang karena konfigurasi")
}
}
Sistem dapat menghancurkan Activity dalam status onStop tanpa memanggil onDestroy saat memori tidak mencukupi. Oleh karena itu, semua data kritis harus disimpan sebelum transisi ke onStop. Bendera isChangingConfigurations() memungkinkan untuk menentukan apakah panggilan onStop terkait dengan rotasi layar — dalam kasus ini Activity akan dibuat ulang, bukan diakhiri.
onDestroy() — metode terakhir siklus hidup, dipanggil sebelum penghancuran total Activity. Sistem memanggil onDestroy dalam dua kasus: Activity diakhiri dengan memanggil finish() atau pengguna menekan tombol “Kembali”; Activity dihancurkan oleh sistem karena perubahan konfigurasi (misalnya, rotasi layar) dan akan dibuat ulang. Metode onDestroy memungkinkan pembersihan akhir sumber daya: melepas thread dan coroutine, menutup kursor dan soket yang terbuka secara permanen, melepaskan memori native melalui NDK.
override fun onDestroy() {
super.onDestroy()
backgroundJob.cancel()
dbHelper.close()
if (isFinishing) {
Log.d("Lifecycle", "Activity diakhiri secara final")
} else {
Log.d("Lifecycle", "Activity akan dibuat ulang")
}
}
Catatan penting: onDestroy tidak dijamin jika proses aplikasi dibunuh oleh sistem (out-of-memory kill). Oleh karena itu, tidak dapat mengandalkan onDestroy untuk menyimpan data — tugas ini diselesaikan di onPause atau onStop. Properti isFinishing memungkinkan membedakan penghentian Activity melalui finish() dari pembuatan ulang saat perubahan konfigurasi.
onRestart() dipanggil sebelum onStart(), saat Activity kembali dari status terhenti (onStop) ke latar depan. Ini terjadi ketika pengguna membuka kembali aplikasi dari menu “Terbaru” atau kembali ke Activity dengan menekan “Kembali” di layar anak. Metode onRestart memungkinkan menjalankan logika yang berbeda dari onCreate — misalnya, memperbarui data yang mungkin berubah saat Activity tersembunyi.
override fun onRestart() {
super.onRestart()
refreshDataFromNetwork()
Log.d("Lifecycle", "Activity dimulai ulang dari tumpukan")
}
Skenario umum: pengguna membuka aplikasi, beralih ke tugas lain, dan kembali satu jam kemudian. Di onRestart, aplikasi dapat memeriksa keaktualan data dan, jika banyak waktu telah berlalu, menawarkan untuk memuat ulang konten. Ini meningkatkan pengalaman pengguna dan mengurangi kemungkinan menampilkan informasi usang.
Rotasi layar — skenario paling umum untuk pembuatan ulang Activity. Secara default, Android menghancurkan Activity saat ini dan membuat yang baru pada setiap perubahan orientasi. Jika status tidak disimpan, pengguna akan kehilangan semua data yang dimasukkan. Untuk ini, Android menyediakan dua mekanisme: onSaveInstanceState() untuk data yang dapat diserialisasi dan ViewModel untuk data yang bertahan dari perubahan konfigurasi.
onSaveInstanceState() dipanggil sebelum penghancuran Activity untuk menyimpan status sementara. Data yang disimpan diteruskan ke onCreate melalui parameter savedInstanceState dan ke metode onRestoreInstanceState() yang dipanggil setelah onStart. Bundle memiliki batasan ukuran — sekitar 500 KB, oleh karena itu data dalam jumlah besar (misalnya, bitmap) disimpan melalui ViewModel.
<!-- AndroidManifest.xml — fiksasi orientasi -->
<activity android:name=".MainActivity"
android:configChanges="orientation|screenSize" />
Memperbaiki orientasi melalui android:configChanges mencegah pembuatan ulang Activity, tetapi dianggap antipattern jika aplikasi harus mendukung kedua orientasi. Rekomendasi modern Google — gunakan ViewModel bersama onSaveInstanceState untuk data yang dimasukkan pengguna di UI.
Fragment memiliki siklus hidup sendiri, mirip dengan Activity, tetapi dengan metode tambahan: onAttach, onCreate, onCreateView, onViewCreated, onStart, onResume, onPause, onStop, onDestroyView, onDestroy, onDetach. Fragment selalu ada di dalam Activity, dan siklus hidupnya terikat pada siklus hidup Activity-wadah. Jika Activity dihancurkan, Fragment mengikutinya.
Perbedaan utama: Fragment tidak hanya mengelola status komponen, tetapi juga hierarki View. Metode onCreateView mengembalikan View root fragmen, dan onDestroyView menghancurkan hierarki ini. Ini memungkinkan Fragment bertahan dari pembuatan ulang Activity saat rotasi layar: Fragment dipertahankan, dan View-nya dibuat ulang di onCreateView.
class ProfileFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
return inflater.inflate(R.layout.fragment_profile, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val avatarImage: ImageView = view.findViewById(R.id.avatar_image)
loadAvatar(avatarImage)
}
}
Memahami perbedaan antara onCreate dan onCreateView sangat penting: onCreate dipanggil sekali dalam masa hidup Fragment (bahkan saat pembuatan ulang View), sedangkan onCreateView dipanggil setiap kali Fragment membuat atau membuat ulang hierarki View-nya. Inisialisasi data dilakukan di onCreate, dan pengikatan UI di onViewCreated.
LifecycleObserver — komponen pustaka Android Jetpack yang memungkinkan bereaksi terhadap perubahan siklus hidup tanpa menimpa metode di Activity atau Fragment. Alih-alih menduplikasi kode di setiap metode siklus hidup, pengembang membuat kelas terpisah dengan anotasi @OnLifecycleEvent dan meneruskannya ke lifecycle.addObserver().
Jetpack juga menyediakan kelas LifecycleOwner — antarmuka yang diimplementasikan oleh AppCompatActivity dan Fragment. Objek apa pun yang mengimplementasikan LifecycleOwner dapat mengelola langganan LiveData, coroutine melalui lifecycleScope, dan pekerjaan WorkManager yang terkait dengan siklus hidup. Ini adalah batu penjuru arsitektur Android modern berdasarkan MVVM dan Jetpack.
class MyLocationObserver(private val context: Context) : DefaultLifecycleObserver {
override fun onStart(owner: LifecycleOwner) {
startLocationUpdates()
}
override fun onStop(owner: LifecycleOwner) {
stopLocationUpdates()
}
}
// Di Activity:
lifecycle.addObserver(MyLocationObserver(this))
Penggunaan DefaultLifecycleObserver menyederhanakan pengujian, mengurangi duplikasi kode, dan membuat logika siklus hidup dapat digunakan kembali di antara layar yang berbeda. Ini adalah pengganti modern untuk penimpaan manual onStart/onStop di setiap Activity. Dalam aplikasi Android yang dikembangkan oleh IT Sectr, kami menerapkan LifecycleObserver untuk geolokasi, pemindaian Bluetooth, dan analitik — ini mengurangi jumlah kode boilerplate sebesar 30–40%.
Pertanyaan yang Sering Diajukan
Jika super.onCreate() atau metode super siklus hidup lainnya tidak dipanggil, sistem akan melempar pengecualian SuperNotCalledException dan aplikasi akan crash. Ini adalah persyaratan ketat Android Runtime — setiap metode harus mendelegasikan eksekusi ke kelas dasar, jika tidak, mesin status internal tidak dapat beralih ke status berikutnya.
Activity dibuat ulang saat rotasi layar karena perubahan orientasi adalah perubahan konfigurasi perangkat (configuration change). Secara default, Android menghancurkan Activity dan membuat yang baru untuk memuat sumber daya alternatif (layout-land, values-land). Untuk menonaktifkan pembuatan ulang, Anda dapat menambahkan atribut android:configChanges ke manifes, tetapi Google merekomendasikan penggunaan ViewModel untuk menyimpan data.
Data kritis disimpan di onPause(), karena ini adalah metode terakhir yang dijamin dipanggil sebelum aplikasi dapat dibunuh oleh sistem. Setelah onStop dan onDestroy, sistem dapat mengakhiri proses tanpa memanggil metode tambahan. Untuk draf dan data sementara, gunakan SharedPreferences dengan apply() atau Room dengan coroutine.
onPause dipanggil saat Activity kehilangan fokus tetapi tetap terlihat sebagian (misalnya, dialog terbuka). onStop dipanggil saat Activity sepenuhnya tersembunyi dari layar oleh Activity lain atau dengan menekan tombol “Beranda”. Perbedaan praktis utama: onPause adalah titik penyimpanan data terakhir, onStop adalah tempat pelepasan listener dan layanan sistem yang tidak diperlukan di latar belakang.
ViewModel — komponen Android Jetpack yang menyimpan data UI dan secara otomatis bertahan dari perubahan konfigurasi (rotasi layar). ViewModel tidak dihancurkan saat pembuatan ulang Activity: ia hidup sampai LifecycleOwner (Activity atau Fragment) berakhir secara final. Ini memecahkan masalah penyimpanan data saat rotasi layar tanpa menggunakan Bundle dan onSaveInstanceState. ViewModel adalah elemen wajib arsitektur MVVM yang direkomendasikan oleh Google.
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