onStart: esensi, visibilitas Activity di layar Android

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

onStart — adalah metode siklus hidup Android yang dipanggil ketika Activity atau Fragment menjadi terlihat oleh pengguna. Pada saat ini layar muncul di tampilan perangkat, tetapi belum dapat berinteraksi dengan pengguna — fokus input tidak ada hingga pemanggilan onResume. Metode onStart sangat cocok untuk mendaftarkan pendengar sistem, terhubung ke layanan geolokasi, dan memulai animasi yang harus bekerja selama komponen terlihat di layar. Pelajari lebih lanjut tentang siklus hidup Activity secara lengkap di artikel Activity Lifecycle.

Utama

  • onStart — dipanggil ketika Activity atau Fragment menjadi terlihat di layar; mendahului onResume
  • Registrasi pendengar — BroadcastReceiver, LocationListener, SensorListener mendaftar di onStart dan berhenti berlangganan di onStop
  • Animasi — memulai animasi yang harus bekerja selama layar terlihat; menjeda di onStop
  • Layanan Bound — terhubung ke layanan klien-server melalui bindService di onStart, putus koneksi di onStop
  • onStart vs onResume — onStart = visibilitas, onResume = fokus + interaksi; tingkat aktivitas layar yang berbeda
  • Fragment.onStart — dipanggil setelah Activity.onStart, ketika Fragment menjadi terlihat di kontainer
  • Pasangan onStart/onStop — sumber daya yang terhubung di onStart harus dilepaskan di onStop untuk mencegah kebocoran

Esensi metode onStart di Android

onStart — metode kedua siklus hidup Activity, dipanggil oleh sistem setelah onCreate (atau setelah onRestart saat kembali dari keadaan berhenti). Pada saat pemanggilan onStart, Activity atau Fragment menjadi terlihat di layar. Pengguna melihat antarmuka, tetapi layar belum siap untuk interaksi — fokus input akan muncul hanya setelah onResume.

Metode onStart termasuk dalam “masa hidup terlihat” (visible lifetime) Activity — interval antara onStart dan onStop. Selama periode ini Activity mungkin sebagian tertutup oleh jendela lain (misalnya, Activity transparan atau jendela dialog), tetapi UI-nya tetap terlihat. Ini membedakan masa hidup terlihat dari “masa hidup di latar depan” (onResume — onPause), ketika Activity memiliki fokus input penuh.

Memahami hierarki tiga tingkat ini sangat penting untuk distribusi kode yang benar. onCreate — inisialisasi satu kali, onStart — menghubungkan sumber daya yang terlihat, onResume — akses monopoli ke sumber daya eksklusif. Pengembang yang mencampuradukkan tingkat-tingkat ini berisiko menciptakan kebocoran memori atau perilaku aplikasi yang salah saat beralih antar layar.

onStart di Activity

Di Activity, metode onStart dipanggil setiap kali layar muncul di tampilan — baik pada peluncuran pertama (setelah onCreate) maupun saat kembali dari mode latar belakang (setelah onRestart). Berbeda dengan onCreate, onStart dapat dipanggil berkali-kali selama masa hidup instance Activity, oleh karena itu di sini ditempatkan kode yang harus dijalankan setiap kali layar muncul.

kotlin
class DashboardActivity : AppCompatActivity() {
    private val connectivityReceiver = object : BroadcastReceiver() {
        override fun onReceive(context: Context?, intent: Intent?) {
            val isConnected = ... // pemeriksaan ConnectivityManager
            binding?.statusIndicator?.setColor(
                if (isConnected) Color.GREEN else Color.RED
            )
        }
    }

    override fun onStart() {
        super.onStart()
        registerReceiver(
            connectivityReceiver,
            IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)
        )
        SensorManager.getInstance().registerStepCounter()
    }

    override fun onStop() {
        unregisterReceiver(connectivityReceiver)
        SensorManager.getInstance().unregisterStepCounter()
        super.onStop()
    }
}

Aturan kunci: semua sumber daya yang terhubung di onStart harus dilepaskan di onStop. Ini menjamin bahwa ketika Activity tersembunyi dari layar, ia tidak mengonsumsi baterai, tidak mendengarkan peristiwa sistem, dan tidak memenuhi memori. Android Studio berisi aturan lint yang memperingatkan tentang registrasi BroadcastReceiver tanpa pembatalan berlangganan yang sesuai.

onStart di Fragment

onStart di Fragment terkait erat dengan siklus hidup Activity-kontainer. Fragment menerima panggilan onStart setelah Activity tempat ia berada menerima onStart. Namun, jika Fragment ditambahkan dalam mode tertunda (FragmentTransaction.commit() tanpa addToBackStack), onStart dapat dipanggil dengan penundaan.

kotlin
class MapFragment : Fragment() {
    private var mapView: MapView? = null

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        mapView = MapView(requireContext())
        return mapView!!
    }

    override fun onStart() {
        super.onStart()
        mapView?.onStart()
        LocationService.connect(requireContext())
    }

    override fun onStop() {
        mapView?.onStop()
        LocationService.disconnect()
        super.onStop()
    }
}

Kekhususan Fragment.onStart: jika Fragment berada di ViewPager dengan offscreenPageLimit = 1, fragmen tetangga juga akan menerima onStart sebelum menjadi terlihat. Ini dapat menyebabkan registrasi pendengar yang prematur. Untuk kasus seperti itu, gunakan metode setUserVisibleHint() atau pemeriksaan isVisible di dalam onStart untuk mendaftarkan pendengar hanya untuk fragmen yang benar-benar terlihat.

Perbedaan antara onStart dan onResume

Perbedaan utama antara onStart dan onResume — tingkat aktivitas layar. onStart menandakan bahwa Activity terlihat di layar, tetapi tidak harus berada di latar depan. onResume menandakan bahwa Activity berada di latar depan dan memiliki fokus input. Perbedaan ini ditunjukkan dengan contoh jendela dialog: ketika Dialog muncul di atas Activity, Activity kehilangan onResume (onPause dipanggil), tetapi tetap terlihat — onStart/onStop tidak dipanggil.

Tabel perbedaan dengan jelas menunjukkan dalam skenario apa setiap metode dipanggil:

SkenarioonStartonResume
Peluncuran aplikasiDipanggilDipanggil
Dialog terbuka di atas ActivityTidak dipanggilonPause (kehilangan fokus)
Menekan tombol “Beranda”onStop (tersembunyi)onPause → onStop
Kembali dari “Terbaru”onStart (terlihat)onResume (fokus)
Rotasi layaronCreate → onStart→ onResume
Panggilan masukonStop (tersembunyi)onPause → onStop

Tabel ini membantu pengembang memutuskan di metode mana untuk menempatkan kode tertentu. Misalnya, jika aplikasi harus menjeda pemutaran video saat layar tertutup (bahkan dengan dialog), kode ditempatkan di onPause. Jika video harus berhenti hanya saat layar sepenuhnya tersembunyi — kode ditempatkan di onStop.

Registrasi pendengar dan layanan

onStart — tempat optimal untuk mendaftarkan pendengar yang hanya boleh bekerja selama Activity terlihat di layar. Ini menyangkut tiga jenis utama komponen sistem: BroadcastReceiver untuk peristiwa sistem, LocationListener untuk geolokasi, dan SensorListener untuk sensor perangkat.

BroadcastReceiver di onStart

BroadcastReceiver didaftarkan secara dinamis melalui Context.registerReceiver() di onStart dan dibatalkan di onStop melalui unregisterReceiver(). Registrasi dinamis lebih diutamakan daripada statis (di manifes), karena membatasi masa hidup penerima pada periode visibilitas Activity — aplikasi tidak terbangun oleh pesan broadcast sistem ketika Activity tersembunyi.

kotlin
private val batteryReceiver = object : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent) {
        val level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1)
        binding?.batteryText?.text = "$level%"
    }
}

override fun onStart() {
    super.onStart()
    registerReceiver(batteryReceiver, IntentFilter(Intent.ACTION_BATTERY_CHANGED))
}

override fun onStop() {
    unregisterReceiver(batteryReceiver)
    super.onStop()
}

LocationListener dan SensorListener

Geolokasi dan sensor — operasi yang membutuhkan banyak sumber daya. Meminta pembaruan GPS di onStart dan membatalkannya di onStop menjamin bahwa aplikasi tidak mengonsumsi baterai ketika layar tersembunyi. Untuk penyesuaian yang tepat, gunakan requestLocationUpdates dengan interval dan jarak minimum — misalnya, 10 detik dan 10 meter, yang memberikan keseimbangan optimal antara akurasi dan konsumsi energi.

Animasi dan onStart

Memulai animasi di onStart, bukan di onCreate, menjamin bahwa animasi mulai setiap kali layar muncul. Jika Anda memulai animasi di onCreate, animasi hanya akan bekerja pada pembuatan Activity pertama, tetapi tidak saat kembali dari mode latar belakang. onStart dipanggil setiap kali Activity menjadi terlihat, menjadikannya tempat yang ideal untuk memulai animasi siklik dan transisi.

kotlin
private lateinit var pulseAnimator: ValueAnimator

override fun onStart() {
    super.onStart()
    pulseAnimator.start()
    binding?.loadingIndicator?.animate()?.alpha(1f)?.start()
}

override fun onStop() {
    pulseAnimator.cancel()
    binding?.loadingIndicator?.animate()?.cancel()
    super.onStop()
}

Untuk animasi yang menggunakan ObjectAnimator atau ValueAnimator, penting untuk memanggil cancel() di onStop. Jika animasi terus berjalan setelah Activity disembunyikan, ia membuang-buang sumber daya GPU dan CPU, yang menurunkan kinerja perangkat dan mempercepat pengosongan baterai. Android Studio Profiler (grafik GPU) memungkinkan Anda melacak animasi aktif dan mendeteksi kebocoran.

Aturan pasangan onStart/onStop juga berlaku untuk bekerja dengan kamera pratinjau (CameraX). Membuka kamera di onStart dan menutupnya di onStop menjamin bahwa kamera tidak terkunci untuk aplikasi lain ketika aplikasi Anda tidak terlihat di layar. Pelanggaran aturan ini adalah salah satu penyebab umum ulasan negatif di Google Play.

Pertanyaan yang Sering Diajukan

Apa perbedaan antara onStart dan onResume untuk registrasi pendengar?

onStart — untuk pendengar yang harus bekerja selama layar terlihat (BroadcastReceiver, LocationListener, SensorListener). onResume — untuk sumber daya yang memerlukan akses monopoli (kamera, perekaman video, pengenalan suara). Pendengar peristiwa sistem tidak memerlukan akses monopoli dan dapat bekerja pada penutupan sebagian — mereka didaftarkan di onStart. Kamera hanya boleh aktif dengan fokus penuh — dibuka di onResume.

Mengapa onStart mungkin tidak dipanggil?

onStart selalu dipanggil jika Activity beralih ke keadaan terlihat. Satu-satunya skenario tanpa onStart — Activity dibuat dan segera diakhiri (misalnya, karena kesalahan di onCreate). Dalam kasus ini, setelah onCreate segera diikuti onDestroy. Tapi ini adalah skenario darurat yang seharusnya tidak terjadi dalam kode yang ditulis dengan benar.

Bisakah onStart dipanggil tanpa onResume?

Ya, onStart mungkin tidak menerima onResume jika Activity lain atau jendela transparan segera terbuka di atas Activity. Misalnya, jika setelah onCreate layar otentikasi diluncurkan (Activity A → Activity B), di Activity A onStart dipanggil, tetapi onResume tidak — ia langsung menerima onPause → onStop saat tertutup oleh layar B.

Berapa kali onStart dapat dipanggil?

onStart dapat dipanggil berkali-kali selama masa hidup instance Activity. Setiap kali Activity beralih dari keadaan tersembunyi (onStop) ke keadaan terlihat, onStart dipanggil. Dalam praktiknya, dengan penggunaan aplikasi yang aktif, onStart dapat dipanggil puluhan atau ratusan kali per sesi.

Apakah layak memuat data di onStart?

Memuat data di onStart dibenarkan jika data harus diperbarui setiap kali layar muncul. Misalnya, umpan berita atau daftar notifikasi. Tetapi pemuatan harus asinkron — melalui coroutine dengan lifecycleScope, agar tidak memblokir thread UI. Untuk data yang tidak berubah antara kemunculan layar, cukup memuatnya sekali di onCreate.

Kesimpulan

  • onStart — metode masa hidup terlihat; dipanggil ketika Activity atau Fragment muncul di layar
  • Registrasi di onStart — BroadcastReceiver, LocationListener, SensorListener mendaftar di onStart dan berhenti berlangganan di onStop
  • onStart vs onResume — onStart = visibilitas, onResume = fokus input; tingkat berbeda untuk jenis sumber daya berbeda
  • Animasi — memulai animasi siklik di onStart, menghentikan di onStop; mencegah kebocoran sumber daya GPU
  • Fragment.onStart — terikat pada Activity.onStart; di ViewPager dipanggil untuk fragmen tetangga lebih awal
  • Aturan pasangan — semua sumber daya onStart harus dilepaskan di onStop, jika tidak kebocoran memori dan baterai
  • Memuat data — di onStart memuat data yang harus diperbarui setiap kali layar muncul

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