onCreate — adalah metode pertama dan satu-satunya yang wajib dari siklus hidup Activity dan Fragment di Android. Sistem memanggilnya satu kali saat pembuatan komponen, meneruskan parameter Bundle dengan status yang disimpan sebelumnya. Di dalam onCreate, pengembang menginisialisasi antarmuka pengguna, mengikat elemen View, mengonfigurasi penangan peristiwa, dan memulihkan data dari savedInstanceState. Tanpa implementasi onCreate yang benar, tidak ada aplikasi Android yang dapat dijalankan — ini adalah titik masuk untuk setiap layar. Baca lebih lanjut tentang siklus hidup Activity secara umum di artikel Activity Lifecycle.
Poin utama
onCreate — metode panggilan balik (callback) yang dipanggil Android saat membuat instance baru Activity atau Fragment. Ini adalah titik masuk pertama ke kode layar pengguna: sebelum panggilan onCreate, tidak ada kode pengguna yang dieksekusi. Sistem meneruskan parameter Bundle ke metode, yang berisi data yang disimpan sebelumnya (saat pembuatan ulang) atau null (saat pertama kali dijalankan).
Metode onCreate didefinisikan di kelas android.app.Activity dan di kelas androidx.fragment.app.Fragment. Kedua varian melakukan tugas serupa: inisialisasi komponen, konfigurasi UI, dan pemulihan status. Namun, implementasi spesifiknya berbeda — Activity menggunakan setContentView untuk memuat tata letak, sedangkan Fragment mengembalikan View melalui onCreateView. Pengembang wajib menimpa setidaknya onCreate di Activity — tanpa ini, Android tidak dapat menampilkan layar.
onCreate dipanggil secara ketat satu kali selama siklus hidup penuh instance Activity. Bahkan saat rotasi layar, instance Activity baru menerima panggilan onCreate baru dengan Bundle dari instance sebelumnya. Properti ini menjadikan onCreate tempat yang ideal untuk inisialisasi satu kali: memuat data, membuat adapter, mengonfigurasi komponen DI melalui Dagger atau Hilt.
Di Activity, metode onCreate melakukan empat tugas utama: memuat tata letak layout, menginisialisasi elemen View, memulihkan status dari Bundle, dan mengonfigurasi penangan peristiwa utama. Kode minimum wajib di onCreate — panggilan super.onCreate(savedInstanceState) dan setContentView(R.layout.activity_main).
class MainActivity : AppCompatActivity() {
private var binding: ActivityMainBinding? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// ViewBinding — pengganti modern untuk findViewById
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding?.root)
// Inisialisasi menggunakan binding
binding?.apply {
welcomeText.text = getString(R.string.welcome)
startButton.setOnClickListener { startGame() }
}
// Pemulihan status
if (savedInstanceState != null) {
score = savedInstanceState.getInt("score", 0)
binding?.scoreText?.text = score.toString()
}
}
}
Praktik modern — menggunakan ViewBinding sebagai pengganti findViewById. ViewBinding menghasilkan kelas ActivityMainBinding pada tahap kompilasi, yang menghilangkan kesalahan dengan ID yang salah dan mengurangi jumlah kode boilerplate. Google merekomendasikan ViewBinding sebagai cara standar untuk mengakses View di Activity dan Fragment mulai Android Studio 3.6.
Urutan tindakan di onCreate harus ketat: pertama super, lalu setContentView, setelah itu semuanya. Memanggil findViewById sebelum setContentView mengembalikan null — tata letak belum dimuat dan elemen View tidak ada dalam hierarki. Ini adalah salah satu kesalahan paling umum dari pengembang Android pemula.
onCreate di Fragment berbeda dari Activity: di sini setContentView tidak dipanggil, hanya inisialisasi data yang tidak terkait dengan UI yang dilakukan. Fragment membagi pembuatan komponen dan pembuatan View menjadi dua metode terpisah: onCreate (dipanggil satu kali) dan onCreateView (dipanggil setiap kali saat pembuatan atau pembuatan ulang View).
class UserListFragment : Fragment() {
private lateinit var viewModel: UserViewModel
private var binding: FragmentUserListBinding? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Inisialisasi ViewModel — akan bertahan dari pembuatan ulang View
viewModel = ViewModelProvider(this)[UserViewModel::class.java]
// Argumen dari FragmentManager
arguments?.let {
viewModel.loadUser(it.getString("user_id") ?: "")
}
// Penyimpanan saat rotasi
retainInstance = true
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
binding = FragmentUserListBinding.inflate(inflater, container, false)
return binding!!.root
}
}
Perbedaan utama antara onCreate Activity dan Fragment: onCreate di Fragment tidak boleh berisi kode yang terkait dengan View, karena View dapat dihancurkan dan dibuat ulang (misalnya, saat mengganti tab ViewPager), sementara onCreate hanya dipanggil satu kali. Memuat data, mengonfigurasi ViewModel, dan menginisialisasi adapter — tugas onCreate, sedangkan mengikat View — tugas onViewCreated.
Parameter savedInstanceState di onCreate — adalah mekanisme untuk menyimpan dan memulihkan status sementara Activity atau Fragment. Saat sistem menghancurkan Activity (rotasi layar, kekurangan memori), sistem memanggil onSaveInstanceState(), di mana pengembang menempatkan pasangan kunci-nilai di Bundle. Saat membuat instance baru, Bundle ini dikembalikan di onCreate.
Bundle mendukung tipe data berikut: String, Integer, Boolean, Long, Float, Double, array-nya, serta objek Parcelable dan Serializable. Untuk objek kompleks, digunakan Parcelable — mekanisme serialisasi yang lebih efisien, khusus untuk Android. Ukuran Bundle dibatasi sekitar 500 KB — melampaui batas menyebabkan pengecualian TransactionTooLargeException.
companion object {
private const val KEY_USER_NAME = "user_name"
private const val KEY_SCORE = "score"
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_game)
if (savedInstanceState != null) {
userName = savedInstanceState.getString(KEY_USER_NAME) ?: ""
currentScore = savedInstanceState.getInt(KEY_SCORE)
}
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putString(KEY_USER_NAME, userName)
outState.putInt(KEY_SCORE, currentScore)
}
Penting untuk dipahami: onSaveInstanceState tidak dipanggil saat pengguna menutup Activity secara eksplisit melalui finish() atau menekan tombol “Kembali”. Sistem menganggap bahwa dalam kasus ini pengguna secara sadar mengakhiri pekerjaan dan menyimpan status tidak diperlukan. Oleh karena itu, tidak boleh hanya mengandalkan savedInstanceState untuk penyimpanan data jangka panjang — gunakan Room, DataStore, atau SharedPreferences.
onCreate dijalankan di utas utama (UI) dan sistem menunggu penyelesaiannya sebelum menampilkan Activity di layar. Jika onCreate berlangsung lebih dari 5 detik, sistem menampilkan dialog ANR (Application Not Responding) dan menyarankan pengguna untuk menutup aplikasi. Operasi panjang seperti memuat data dari jaringan atau membaca dari database harus dipindahkan ke utas latar belakang.
Menurut rekomendasi Google Android Performance (2025), onCreate harus selesai dalam kurang dari 1 detik pada perangkat segmen menengah. Untuk ini, Anda harus: menggunakan inisialisasi malas (delegasi lazy di Kotlin), menunda pemuatan data berat ke onResume atau melalui coroutine, menerapkan ViewStub untuk komponen UI yang jarang digunakan, memprofilkan waktu mulai melalui Android Vitals.
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Inisialisasi malas — objek dibuat hanya saat akses pertama
val heavyData by lazy {
HeavyDataLoader.load()
}
// Memuat data di utas latar belakang melalui lifecycleScope
lifecycleScope.launch(Dispatchers.IO) {
val users = userDao.getAllUsers()
withContext(Dispatchers.Main) {
adapter.submitList(users)
}
}
}
Alat profiling: Android Studio Profiler (tab CPU) menunjukkan waktu eksekusi yang tepat dari setiap metode. Di Android Vitals (konsol Google Play), Anda dapat melacak metrik “Waktu mulai dingin” — jika onCreate Activity Anda melebihi 500 ms, konsol menandainya sebagai masalah kinerja. Kami di IT Sectr menggunakan pengujian Macrobenchmark untuk kontrol otomatis waktu mulai setiap Activity di pipeline CI.
ViewModel — cara terbaik untuk menginisialisasi data di onCreate yang harus bertahan dari rotasi layar. ViewModel dibuat di onCreate melalui ViewModelProvider dan secara otomatis disimpan saat perubahan konfigurasi. Saat Activity dibuat ulang setelah rotasi, ViewModel tetap di memori dan onCreate menerima ViewModel yang sama tanpa kehilangan data.
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_profile)
// ViewModel dibuat satu kali dan bertahan dari perubahan konfigurasi
val viewModel: ProfileViewModel =
ViewModelProvider(this)[ProfileViewModel::class.java]
// Observasi LiveData — UI otomatis diperbarui saat data berubah
viewModel.user.observe(this) { user ->
binding?.userName?.text = user.name
binding?.userEmail?.text = user.email
}
// Memuat data jika ViewModel baru saja dibuat
if (savedInstanceState == null) {
viewModel.loadProfile(userId)
}
}
Kombinasi ViewModel + LiveData/StateFlow memecahkan masalah rotasi layar tanpa penyimpanan manual di Bundle. ViewModel menyimpan data di memori, LiveData secara otomatis berlangganan ulang Activity saat pembuatan ulang, dan StateFlow (dari Kotlin Coroutines) menambahkan reaktivitas dengan dukungan coroutine. Ini adalah arsitektur standar yang direkomendasikan oleh Google dalam panduan Guide to App Architecture.
Bahkan pengembang berpengalaman pun membuat kesalahan tipikal di onCreate. Mari kita lihat lima masalah paling umum dan cara menghindarinya.
Kesalahan paling umum — mencoba menemukan View melalui findViewById sebelum panggilan setContentView. Semua elemen View dibuat saat inflasi tata letak, sehingga setiap referensi ke findViewById sebelum setContentView mengembalikan null dan menyebabkan NullPointerException saat mencoba menggunakan View. Solusi: urutan ketat — pertama super, lalu setContentView, setelah itu findViewById atau ViewBinding.
Memuat data dari jaringan, membaca dari database, atau memproses array besar langsung di onCreate memblokir render frame pertama. Pengguna melihat layar hitam sampai onCreate selesai, yang memperburuk persepsi kecepatan aplikasi. Solusi: gunakan lifecycleScope.launch untuk operasi asinkron, tampilkan kerangka (placeholder UI) hingga pemuatan selesai.
Jika saat rotasi layar status tidak dipulihkan dari Bundle, pengguna kehilangan semua input yang belum disimpan: teks di bidang formulir, posisi gulir, elemen yang dipilih. Solusi: selalu periksa savedInstanceState != null di onCreate untuk memulihkan data, bahkan jika kehilangan status tampaknya tidak mungkin.
Kelas anonim dan lambda di onCreate dapat secara implisit menahan referensi ke Activity setelah dihancurkan. Misalnya, Handler yang dibuat di onCreate terus menjalankan tugas yang ditunda bahkan setelah Activity dihancurkan. Solusi: gunakan LifecycleObserver, ViewModel, dan lifecycleScope, yang secara otomatis membatalkan tugas saat penghancuran.
Inisialisasi View di onCreate Fragment — kesalahan logis, karena View dapat dibuat ulang tanpa panggilan onCreate. Jika pendengar diatur di onCreate dan View diikat di onCreateView, saat pembuatan ulang pendengar tetap di View lama. Solusi: semua pekerjaan dengan View dilakukan di onViewCreated, dan onCreate hanya untuk inisialisasi lapisan data.
Pertanyaan yang sering diajukan
Ya, menimpa onCreate wajib untuk setiap Activity yang menampilkan antarmuka pengguna. Tanpa ini, tidak mungkin memanggil setContentView dan memuat tata letak XML. Jika Activity tidak memiliki UI (misalnya, Activity-stub transparan), onCreate tetap ditimpa, tetapi tanpa memanggil setContentView.
Tidak, onCreate tidak dapat dipanggil lagi untuk instance Activity yang sama. Jika Activity dihancurkan dan dibuat ulang (rotasi layar, kekurangan memori), ini adalah instance baru dengan panggilan onCreate baru. Pengecualian — metode recreate(), yang memaksa menghancurkan dan membuat ulang Activity, tetapi ini juga pembuatan instance baru.
Jika super.onCreate(savedInstanceState) tidak dipanggil, Android Runtime akan melempar pengecualian SuperNotCalledException dan aplikasi akan crash. Sistem secara ketat mensyaratkan bahwa setiap metode siklus hidup yang ditimpa memanggil versi super-nya — ini menjamin pengoperasian mesin status internal yang benar.
Perbedaan utama: onCreate di Activity memuat UI melalui setContentView, sedangkan onCreate di Fragment hanya menginisialisasi data. Fragment membuat View di metode terpisah onCreateView, yang dapat dipanggil beberapa kali (misalnya, saat mengganti tab), sementara onCreate Fragment dipanggil satu kali selama masa pakai instance Fragment.
Data yang diinisialisasi di onCreate disimpan di bidang kelas Activity atau Fragment. Misalnya, private lateinit var binding: ActivityMainBinding dideklarasikan di tingkat kelas, diinisialisasi di onCreate, dan dapat diakses di semua metode berikutnya. Untuk data yang bertahan dari rotasi layar, gunakan ViewModel dengan LiveData atau StateFlow.
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