onResume — dasar-dasar, interaksi dengan pengguna di Android

Penulis: IT Sectr Diterbitkan: 2026-03-04 Waktu membaca: 10 mnt

onResume — adalah metode siklus hidup Android yang dipanggil ketika Activity atau Fragment muncul ke latar depan dan menerima fokus masukan. Dalam keadaan ini layar siap untuk berinteraksi dengan pengguna: semua peristiwa sentuhan, penekanan tombol, dan gerakan diarahkan ke komponen ini. onResume adalah keadaan kerja Activity di mana aplikasi menghabiskan sebagian besar waktu. Di sinilah kamera dibuka, pemutaran video dimulai, pengenalan suara dimulai, dan pendengar sensor yang memerlukan akses eksklusif didaftarkan. Baca lebih lanjut tentang siklus hidup Activity lengkap di artikel Activity Lifecycle.

Poin Utama

  • onResume — Activity di latar depan dengan fokus masukan; dipanggil setelah onStart atau setelah kembali dari jendela dialog
  • Sumber daya eksklusif — kamera, mikrofon, tangkapan video dibuka di onResume dan ditutup di onPause
  • Pasangan onResume/onPause — sumber daya yang memerlukan fokus penuh dikelola oleh pasangan ini; didaftarkan di onResume, dibebaskan di onPause
  • onResume vs onStart — onStart = visibilitas, onResume = interaksi; dialog menutupi onResume tetapi tidak onStart
  • Waktu — onResume harus cepat; operasi panjang di sini menunda respons antarmuka
  • Fragment.onResume — dipanggil setelah Activity.onResume, ketika Fragment siap untuk berinteraksi
  • onResume di Jetpack — lifecycleScope dan LiveData menggunakan onResume untuk manajemen langganan otomatis

Dasar-dasar metode onResume di Android

onResume — metode ketiga siklus hidup Activity, dipanggil setelah onStart, yang menandakan kesiapan layar untuk interaksi penuh dengan pengguna. Pada saat ini Activity berada di puncak tumpukan tugas (back stack), sistem mengarahkan semua peristiwa masukan kepadanya, dan aplikasi dapat memulai operasi apa pun yang memerlukan partisipasi aktif pengguna: panggilan video, game, perekaman audio, menggambar di Canvas.

onResume termasuk dalam masa hidup latar depan (foreground lifetime) — rentang antara onResume dan onPause. Ini adalah periode kerja Activity yang paling aktif, ketika aplikasi mengonsumsi sumber daya maksimum: prosesor untuk memproses sentuhan, GPU untuk merender animasi, kamera dan mikrofon untuk tangkapan video. Memahami tingkat siklus hidup ini sangat penting untuk mengoptimalkan konsumsi daya — sumber daya yang dibuka di onResume harus segera ditutup di onPause.

Menurut data Google I/O 2025, rata-rata waktu yang dihabiskan Activity dalam keadaan onResume per sesi adalah 2–5 menit untuk aplikasi berita dan 15–30 menit untuk game dan aplikasi pesan. Sisanya Activity berada dalam keadaan onPause, onStop, atau onDestroy. Ini berarti bahwa optimalisasi kode onResume memberikan keuntungan terbesar dalam performa dan masa pakai baterai.

onResume di Activity

Di Activity, metode onResume dipanggil setiap kali layar menerima fokus masukan — saat pertama kali dijalankan, saat kembali dari Activity lain, saat menutup jendela dialog, saat membuka kunci perangkat. Ini adalah metode panas yang dapat dipanggil berkali-kali selama sesi, dan implementasinya harus seringan mungkin.

kotlin
class CameraActivity : AppCompatActivity() {
    private var cameraProvider: ProcessCameraProvider? = null
    private var preview: Preview? = null

    override fun onResume() {
        super.onResume()
        val cameraProviderFuture = ProcessCameraProvider.getInstance(this)
        cameraProviderFuture.addListener({
            cameraProvider = cameraProviderFuture.get()
            val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
            preview = Preview.Builder().build().also {
                it.setSurfaceProvider(binding?.viewFinder?.surfaceProvider)
            }
            try {
                cameraProvider?.unbindAll()
                cameraProvider?.bindToLifecycle(
                    this, cameraSelector, preview
                )
            } catch (e: Exception) {
                Log.e("Camera", "Gagal mengikat kamera", e)
            }
        }, ContextCompact.getMainExecutor(this))
    }

    override fun onPause() {
        super.onPause()
        cameraProvider?.unbindAll()
        preview = null
    }
}

Contoh dengan CameraX menunjukkan penggunaan klasik onResume/onPause: kamera adalah sumber daya eksklusif yang hanya dapat digunakan oleh satu aplikasi pada satu waktu. Mengikat kamera ke siklus hidup melalui bindToLifecycle secara otomatis menutup kamera di onPause, tetapi panggilan eksplisit unbindAll menjamin pembebasan segera. Ini sangat penting saat beralih antar Activity: kamera harus dibebaskan sebelum Activity lain mencoba membukanya.

onResume di Fragment

onResume di Fragment dipanggil setelah Activity yang mengandungnya menerima onResume. Namun karena kekhasan FragmentManager dan ViewPager, momen pemanggilan onResume untuk Fragment dapat ditunda relatif terhadap Activity. Misalnya, Fragment di ViewPager dengan offscreenPageLimit = 1 menerima onResume hanya ketika menjadi halaman saat ini, bukan saat Activity dimulai.

kotlin
class VideoPlayerFragment : Fragment() {
    private var exoPlayer: ExoPlayer? = null

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        exoPlayer = ExoPlayer.Builder(requireContext()).build()
        binding?.playerView?.player = exoPlayer
    }

    override fun onResume() {
        super.onResume()
        exoPlayer?.play()
        if (userVisibleHint) {
            startBiometricAuth()
        }
    }

    override fun onPause() {
        exoPlayer?.pause()
        stopBiometricAuth()
        super.onPause()
    }
}

Pemeriksaan userVisibleHint di Fragment.onResume relevan untuk ViewPager: Fragment dapat menerima onResume tetapi disembunyikan oleh halaman tetangga (misalnya, selama transisi animasi). Dalam kasus seperti itu, memulai video atau biometrik di onResume tanpa memeriksa visibilitas akan menyebabkan perilaku yang tidak diharapkan. Mulai Fragment 1.5.0, disarankan menggunakan FragmentTransaction.setMaxLifecycle() untuk kontrol siklus hidup fragmen yang tepat di ViewPager2.

onResume vs onStart: kapan menggunakan apa

Pengembang sering bingung antara onStart dan onResume, menempatkan kode di metode yang salah. Aturan utama: onStart — untuk sumber daya yang bekerja saat visibilitas; onResume — untuk sumber daya yang memerlukan fokus masukan. Mari kita lihat skenario spesifik dan pilihan metode yang benar.

OperasiMetodeAlasan
Berlangganan geolokasionStart / onStopGPS dapat bekerja dengan visibilitas parsial
Membuka kameraonResume / onPauseKamera — sumber daya eksklusif
BroadcastReceiveronStart / onStopPeristiwa sistem tidak memerlukan fokus
Pemutaran videoonResume / onPauseVideo harus terlihat oleh pengguna
Pemindaian BluetoothonStart / onStopPemindaian dapat berjalan di latar belakang
Perekam suara (MediaRecorder)onResume / onPausePerekaman memerlukan UI aktif
Pendengar sensoronResume / onPauseSensor untuk game dan gerakan
Memperbarui dataonStartData segar diperlukan saat muncul

Aturan praktis: jika operasi harus terputus saat jendela dialog muncul — gunakan onResume/onPause. Jika operasi dapat berlanjut saat layar tertutup sebagian — gunakan onStart/onStop. Misalnya, pemutar video harus menjeda video saat dialog dibuka (onPause), sementara geolokasi dapat terus diperbarui (tetap di onStart).

Manajemen sumber daya eksklusif

Sumber daya eksklusif adalah komponen perangkat yang hanya dapat digunakan oleh satu aplikasi pada waktu tertentu. Kamera, mikrofon, keluaran video (MediaProjection), adaptor NFC dalam mode baca, perangkat USB dalam mode accessory — semua sumber daya ini harus dibuka di onResume dan dibebaskan di onPause.

Bekerja dengan MediaRecorder

MediaRecorder digunakan untuk merekam audio dan video. Permintaan izin dan persiapan MediaRecorder dilakukan di onCreate, dan memulai perekaman di onResume. Jika pengguna beralih ke aplikasi lain, onPause menjeda perekaman, dan onResume melanjutkannya. Ini adalah perilaku standar untuk perekam suara dan aplikasi perekaman video.

kotlin
private var mediaRecorder: MediaRecorder? = null
private var isRecording = false

override fun onResume() {
    super.onResume()
    if (isRecording) {
        mediaRecorder?.resume()
    }
}

override fun onPause() {
    if (isRecording) {
        mediaRecorder?.pause()
    }
    super.onPause()
}

BiometricPrompt dan onResume

Autentikasi biometrik (BiometricPrompt) hanya boleh dipanggil ketika Activity berada di onResume. Jika dipanggil di onCreate atau onStart, dialog biometrik dapat muncul sebelum Activity menyelesaikan inisialisasi, yang menyebabkan pemrosesan hasil yang tidak benar. Pemanggilan di onResume menjamin bahwa jendela biometrik akan ditampilkan dalam konteks yang benar.

Pola dan rekomendasi

Mari kita lihat tiga pola kerja onResume yang terbukti dan diterapkan dalam proyek komersial: mengatur ulang timer tidak aktif, memperbarui data yang terlihat, dan integrasi dengan Jetpack Navigation.

Mengatur ulang timer tidak aktif

Di aplikasi dengan data rahasia (perbankan, catatan medis) onResume digunakan untuk mengatur ulang timer keluar otomatis. Jika pengguna aktif berinteraksi dengan aplikasi, onResume dipanggil setiap kali beralih antar layar dan timer diatur ulang. Jika pengguna meminimalkan aplikasi, onPause menghentikan timer, dan onResume saat kembali baik mengatur ulangnya atau meminta autentikasi ulang.

Memperbarui data saat kembali

Daftar yang harus menampilkan data terkini setiap kali kembali ke layar diperbarui di onResume. Misalnya, jika pengguna membuat catatan baru di Activity lain dan kembali, onResume memuat ulang daftar dari basis data lokal atau dari cache ViewModel. Ini memastikan konsistensi data tanpa panggilan manual notifyDataSetChanged.

kotlin
override fun onResume() {
    super.onResume()
    // ActivityResultLauncher mengembalikan hasil — memperbarui daftar
    viewModel.refreshList()
    // Mengatur ulang timer tidak aktif
    inactivityTimer.reset()
}

Jetpack Navigation dan onResume

Di Jetpack Navigation onResume fragmen dipanggil setiap kali kembali kepadanya melalui navigasi mundur. Properti ini digunakan untuk mengatur ulang status UI: menyembunyikan keyboard, membersihkan bidang pencarian, memperbarui judul bilah alat. OnBackPressedCallback bersama dengan onResume memberikan kontrol penuh atas navigasi tanpa duplikasi kode.

Pertanyaan yang Sering Diajukan

Apa perbedaan antara onResume dan onStart dengan kata sederhana?

onStart — layar terlihat. onResume — layar aktif dan siap untuk berinteraksi. Bayangkan: Anda menonton TV (onStart), tetapi mengambil remote di tangan (onResume). TV selalu terlihat, tetapi interaksi dimulai hanya dengan remote. Jika seseorang menutup TV dengan tirai — layar berhenti terlihat (onStop). Jika remote diambil dari Anda — interaksi berhenti (onPause), tetapi TV masih terlihat.

Seberapa sering onResume dipanggil?

onResume dipanggil setiap kali Activity menerima fokus masukan. Jumlah minimum — satu kali (saat dimulai). Maksimum tergantung pada skenario penggunaan: beralih antar layar, membuka dialog, mengunci dan membuka kunci perangkat dengan cepat — setiap skenario tersebut memanggil onResume saat kembali ke layar.

Mengapa onResume adalah tempat terbaik untuk membuka kamera?

Kamera — sumber daya eksklusif yang hanya tersedia untuk satu aplikasi pada satu waktu. Jika Anda membuka kamera di onCreate atau onStart, kamera akan tetap terkunci untuk aplikasi lain bahkan ketika aplikasi Anda tidak aktif. onResume menjamin bahwa kamera hanya terbuka ketika Activity di latar depan, dan onPause segera menutupnya. Ini adalah standar pengembangan Android yang ditetapkan dalam dokumentasi CameraX dan Camera2 API.

Bisakah onResume tidak dipanggil setelah onStart?

Ya, onResume mungkin tidak terjadi jika Activity ditutupi oleh Activity lain segera setelah muncul. Misalnya, Activity A meluncurkan Activity B di metode onCreate atau onStart. Dalam kasus ini A menerima onStart → onPause → onStop, melewatkan onResume. Sistem tidak memanggil onResume karena Activity A tidak pernah menerima fokus masukan.

Apa yang tidak boleh dilakukan di onResume?

Di onResume tidak boleh melakukan operasi sinkron panjang: memuat data besar dari jaringan, kueri SQL kompleks, pemrosesan gambar. Metode onResume berjalan di thread UI dan setiap pemblokiran lebih dari 100–200 ms menyebabkan keterlambatan respons antarmuka. Semua operasi berat harus asinkron — melalui korutin, RxJava, atau WorkManager. Juga tidak disarankan memanggil finish() di onResume tanpa pemeriksaan — ini dapat menyebabkan lingkaran pembuatan ulang tak terbatas.

Kesimpulan

  • onResume — keadaan latar depan dengan fokus masukan; Activity siap untuk berinteraksi dengan pengguna
  • Sumber daya eksklusif — kamera, mikrofon, tangkapan video dibuka di onResume dan ditutup di onPause
  • onResume vs onStart — onStart untuk sumber daya terlihat, onResume untuk sumber daya aktif; dialog mengganggu onResume tetapi tidak onStart
  • Kecepatan — onResume harus ringan; semua operasi berat asinkron
  • Fragment.onResume — tergantung pada visibilitas di ViewPager; periksa userVisibleHint atau gunakan setMaxLifecycle
  • Tugas tipikal — mengatur ulang timer, memperbarui data saat kembali, mengelola BiometricPrompt
  • Pasangan onResume/onPause — sumber daya dengan akses eksklusif dikelola semata-mata oleh pasangan ini

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