Activity Lifecycle: apa itu, onCreate onStart onResume di Android

Penulis: IT Sectr Diterbitkan: 2026-03-03 Waktu membaca: 12 mnt

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 — urutan metode yang ditentukan secara ketat: onCreate, onStart, onResume, onPause, onStop, onDestroy
  • onCreate — satu-satunya metode wajib, dipanggil sekali saat pembuatan Activity; di sini dilakukan inisialisasi UI dan data
  • onResume — Activity berada di latar depan dan berinteraksi dengan pengguna; ini adalah status kerja layar
  • onPause / onStop — saat beralih ke mode latar belakang, Activity dijeda terlebih dahulu, lalu dihentikan; di onPause data kritis disimpan
  • onSaveInstanceState — mekanisme penyimpanan status UI saat rotasi layar dan pembuatan ulang Activity oleh sistem
  • Siklus hidup Fragment — mirip dengan Activity, tetapi dilengkapi dengan metode onAttach, onCreateView, onViewCreated, onDestroyView
  • LifecycleObserver — komponen Jetpack untuk pelacakan reaktif status tanpa menimpa metode di Activity

Apa itu Activity Lifecycle

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.

Metode siklus hidup Activity

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.

Skema panggilan umum

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.

kotlin
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.

Tiga level siklus hidup

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 — pembuatan Activity

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.

kotlin
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 — muncul di layar

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.

kotlin
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 — mendapatkan fokus

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.

kotlin
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 — kehilangan fokus

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).

kotlin
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 — tersembunyi dari layar

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.

kotlin
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 — penghancuran Activity

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.

kotlin
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 — kembali dari status terhenti

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.

kotlin
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 dan penyimpanan status

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 dan onRestoreInstanceState

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.

xml
<!-- 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.

Siklus hidup Fragment

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.

kotlin
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 dan Jetpack

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.

kotlin
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

Apa yang terjadi jika super tidak dipanggil dalam metode siklus hidup?

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.

Mengapa Activity dibuat ulang saat rotasi layar?

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.

Dalam metode mana data harus disimpan sebelum menutup aplikasi?

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.

Apa perbedaan onPause dan onStop?

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.

Apa itu ViewModel dan bagaimana hubungannya dengan siklus hidup?

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

  • Activity Lifecycle — urutan metode onCreate, onStart, onResume, onPause, onStop, onDestroy, yang masing-masing bertanggung jawab untuk fase tertentu dari kerja layar
  • onCreate — inisialisasi UI dan menerima savedInstanceState saat pembuatan ulang; satu-satunya metode wajib
  • onStart / onStop — pasangan untuk mengelola visibilitas: pendaftaran dan pelepasan listener dan layanan sistem
  • onResume / onPause — pasangan untuk mengelola fokus: sumber daya eksklusif (kamera, sensor) dibuka di onResume dan ditutup di onPause
  • Rotasi layar — secara default membuat ulang Activity; penyimpanan status melalui onSaveInstanceState + ViewModel adalah praktik standar
  • Fragment Lifecycle — dilengkapi dengan metode onAttach, onCreateView, onViewCreated, onDestroyView, onDetach; View dibuat dan dihancurkan terpisah dari Fragment itu sendiri
  • LifecycleObserver — komponen Jetpack untuk pelacakan reaktif siklus hidup tanpa duplikasi kode di Activity
  • ViewModel — bertahan dari perubahan konfigurasi dan memecahkan masalah kehilangan data saat rotasi layar tanpa penyimpanan manual di Bundle
  • Aturan super — setiap metode siklus hidup yang ditimpa wajib memanggil versi super, jika tidak sistem akan melempar SuperNotCalledException

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