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 — 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.
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.
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 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.
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 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:
| Skenario | onStart | onResume |
|---|---|---|
| Peluncuran aplikasi | Dipanggil | Dipanggil |
| Dialog terbuka di atas Activity | Tidak dipanggil | onPause (kehilangan fokus) |
| Menekan tombol “Beranda” | onStop (tersembunyi) | onPause → onStop |
| Kembali dari “Terbaru” | onStart (terlihat) | onResume (fokus) |
| Rotasi layar | onCreate → onStart | → onResume |
| Panggilan masuk | onStop (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.
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 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.
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()
}
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.
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.
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
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.
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.
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.
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.
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
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