onCreate, Android’de Activity ve Fragment yaşam döngüsünün ilk ve tek zorunlu yöntemidir. Sistem, bir bileşen oluştururken onu bir kez çağırır ve önceden kaydedilmiş durumu içeren Bundle parametresini iletir. onCreate içinde, geliştirici kullanıcı arayüzünü başlatır, View öğelerini bağlar, olay işleyicilerini yapılandırır ve savedInstanceState’dan verileri geri yükler. onCreate’in doğru bir şekilde uygulanması olmadan, hiçbir Android uygulaması başlatılamaz — her ekran için giriş noktasıdır. Genel Activity yaşam döngüsü hakkında daha fazla ayrıntı için Activity Lifecycle makalesini okuyun.
Önemli noktalar
onCreate, Android’in bir Activity veya Fragment’in yeni bir örneğini oluştururken çağırdığı bir geri çağırma (callback) yöntemidir. Bu, kullanıcı ekranı koduna ilk giriş noktasıdır: onCreate çağrılmadan önce hiçbir kullanıcı kodu çalıştırılmaz. Sistem, yönteme bir Bundle parametresi iletir; bu parametre, önceden kaydedilmiş verileri (yeniden oluşturma sırasında) veya null’u (ilk başlatmada) içerir.
onCreate yöntemi, android.app.Activity sınıfında ve androidx.fragment.app.Fragment sınıfında tanımlanmıştır. Her iki varyant da benzer görevleri yerine getirir: bileşen başlatma, UI kurulumu ve durum geri yükleme. Ancak, belirli uygulama farklılık gösterir — Activity, düzeni yüklemek için setContentView kullanırken, Fragment onCreateView üzerinden bir View döndürür. Geliştiricinin Activity’de en azından onCreate’i geçersiz kılması gerekir — bu olmadan Android ekranı görüntüleyemez.
onCreate, bir Activity örneğinin tam yaşam döngüsü boyunca kesinlikle bir kez çağrılır. Ekran dönüşünde bile, yeni bir Activity örneği, önceki örnekten gelen Bundle ile yeni bir onCreate çağrısı alır. Bu, onCreate’i tek seferlik başlatma için ideal bir yer haline getirir: veri yükleme, bağdaştırıcı oluşturma, Dagger veya Hilt üzerinden DI bileşenlerini ayarlama.
Activity’de, onCreate yöntemi dört ana görevi yerine getirir: düzen şablonunu yükleme, View öğelerini başlatma, Bundle’dan durumu geri yükleme ve birincil olay işleyicilerini ayarlama. onCreate’teki zorunlu minimum kod, super.onCreate(savedInstanceState) ve setContentView(R.layout.activity_main) çağrısıdır.
class MainActivity : AppCompatActivity() {
private var binding: ActivityMainBinding? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// ViewBinding — findViewById’in modern bir alternatifi
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding?.root)
// Binding kullanarak başlatma
binding?.apply {
welcomeText.text = getString(R.string.welcome)
startButton.setOnClickListener { startGame() }
}
// Durum geri yükleme
if (savedInstanceState != null) {
score = savedInstanceState.getInt("score", 0)
binding?.scoreText?.text = score.toString()
}
}
}
Modern uygulama, findViewById yerine ViewBinding kullanır. ViewBinding, derleme zamanında ActivityMainBinding sınıfını oluşturur ve hatalı kimliklerden kaynaklanan hataları ortadan kaldırır ve kalıp kodunu azaltır. Google, Android Studio 3.6’dan itibaren Activity ve Fragment’te View’e erişmenin standart yolu olarak ViewBinding’i önermektedir.
onCreate’teki işlem sırası kesin olmalıdır: önce super, sonra setContentView, sonra diğer her şey. setContentView’dan önce findViewById çağırmak null döndürür — düzen henüz yüklenmemiştir ve View öğeleri hiyerarşide mevcut değildir. Bu, yeni başlayan Android geliştiricilerinin yaptığı en yaygın hatalardan biridir.
Fragment’te onCreate, Activity’den farklıdır: burada setContentView çağrılmaz, yalnızca UI ile ilgili olmayan veri başlatma işlemi gerçekleştirilir. Fragment, bileşen oluşturma ve View oluşturmayı iki ayrı yönteme ayırır: onCreate (bir kez çağrılır) ve onCreateView (View her oluşturulduğunda veya yeniden oluşturulduğunda çağrılır).
class UserListFragment : Fragment() {
private lateinit var viewModel: UserViewModel
private var binding: FragmentUserListBinding? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// ViewModel başlatma — View yeniden oluşturmayı atlatır
viewModel = ViewModelProvider(this)[UserViewModel::class.java]
// FragmentManager’dan argümanlar
arguments?.let {
viewModel.loadUser(it.getString("user_id") ?: "")
}
// Dönüşte kaydetme
retainInstance = true
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
binding = FragmentUserListBinding.inflate(inflater, container, false)
return binding!!.root
}
}
Activity ve Fragment onCreate arasındaki temel fark: Fragment’teki onCreate, View ile ilgili kod içermemelidir, çünkü View yok edilebilir ve yeniden oluşturulabilir (örneğin ViewPager sekmeleri değiştirilirken), oysa onCreate yalnızca bir kez çağrılır. Veri yükleme, ViewModel kurulumu ve bağdaştırıcı başlatma onCreate görevleridir, View bağlama ise onViewCreated’ın görevidir.
onCreate’teki savedInstanceState parametresi, bir Activity veya Fragment’in geçici durumunu kaydetmek ve geri yüklemek için bir mekanizmadır. Sistem bir Activity’yi yok ettiğinde (ekran dönüşü, bellek yetersizliği), onSaveInstanceState() öğesini çağırır ve geliştirici buraya Bundle’a anahtar-değer girdileri koyar. Yeni bir örnek oluşturulduğunda, bu Bundle onCreate’te döndürülür.
Bundle şu veri türlerini destekler: String, Integer, Boolean, Long, Float, Double, bunların dizileri ve ayrıca Parcelable ve Serializable nesneleri. Karmaşık nesneler için Parcelable kullanılır — Android’e özgü daha verimli bir serileştirme mekanizmasıdır. Bundle boyutu yaklaşık 500 KB ile sınırlıdır — sınırı aşmak TransactionTooLargeException’a neden olur.
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)
}
Anlaşılması önemlidir: kullanıcı finish() veya Geri düğmesiyle Activity’yi açıkça kapattığında onSaveInstanceState çağrılmaz. Sistem, kullanıcının bilinçli olarak çalışmayı sonlandırdığını ve durumu kaydetmesine gerek olmadığını düşünür. Bu nedenle, uzun süreli veri depolama için yalnızca savedInstanceState’a güvenemezsiniz — Room, DataStore veya SharedPreferences kullanın.
onCreate ana (UI) iş parçacığında yürütülür ve sistem, Activity’yi ekranda görüntülemeden önce tamamlanmasını bekler. onCreate 5 saniyeden uzun sürerse, sistem bir ANR (Application Not Responding) iletişim kutusu gösterir ve kullanıcıya uygulamayı kapatma seçeneği sunar. Ağdan veri yükleme veya veritabanından okuma gibi uzun işlemler bir arka plan iş parçacığına taşınmalıdır.
Google Android Performance (2025) önerilerine göre, orta segment cihazlarda onCreate 1 saniyeden az sürmelidir. Bunu başarmak için: tembel başlatma (Kotlin’de lazy delegate) kullanın, ağır veri yüklemeyi onResume’a veya coroutine’lere erteleyin, nadiren kullanılan UI bileşenleri için ViewStub uygulayın ve Android Vitals üzerinden başlangıç süresini profilleme yapın.
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Tembel başlatma — nesne yalnızca ilk erişimde oluşturulur
val heavyData by lazy {
HeavyDataLoader.load()
}
// lifecycleScope üzerinden arka plan iş parçacığında veri yükleme
lifecycleScope.launch(Dispatchers.IO) {
val users = userDao.getAllUsers()
withContext(Dispatchers.Main) {
adapter.submitList(users)
}
}
}
Profilleme araçları: Android Studio Profiler (CPU sekmesi) her yöntemin tam yürütme süresini gösterir. Android Vitals’ta (Google Play Console), “Soğuk başlangıç süresi” metriğini izleyebilirsiniz — Activity’nizin onCreate’i 500 ms’yi aşarsa, konsol bunu bir performans sorunu olarak işaretler. IT Sectr’de, CI hattında her Activity’nin başlangıç süresini otomatik olarak kontrol etmek için Macrobenchmark testleri kullanıyoruz.
ViewModel, ekran dönüşünde hayatta kalması gereken verileri onCreate’te başlatmanın en iyi yoludur. ViewModel, onCreate’te ViewModelProvider aracılığıyla oluşturulur ve yapılandırma değişikliklerinde otomatik olarak korunur. Dönüşten sonra bir Activity yeniden oluşturulduğunda, ViewModel bellekte kalır ve onCreate, veri kaybı olmadan aynı ViewModel’i alır.
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_profile)
// ViewModel bir kez oluşturulur ve yapılandırma değişikliklerini atlatır
val viewModel: ProfileViewModel =
ViewModelProvider(this)[ProfileViewModel::class.java]
// LiveData gözlemi — veriler değiştiğinde UI otomatik olarak güncellenir
viewModel.user.observe(this) { user ->
binding?.userName?.text = user.name
binding?.userEmail?.text = user.email
}
// ViewModel yeni oluşturulduysa veri yükleme
if (savedInstanceState == null) {
viewModel.loadProfile(userId)
}
}
ViewModel + LiveData/StateFlow birleşimi, Bundle’a manuel kaydetme olmadan ekran dönüşü sorununu çözer. ViewModel verileri bellekte saklar, LiveData yeniden oluşturma sırasında Activity’yi otomatik olarak yeniden abone yapar ve StateFlow (Kotlin Coroutines’den) coroutine desteğiyle reaktivite ekler. Bu, Google tarafından Guide to App Architecture’da önerilen standart mimaridir.
Deneyimli geliştiriciler bile onCreate’te tipik hatalar yapar. En yaygın beş soruna ve bunlardan nasıl kaçınılacağına bakalım.
En yaygın hata, setContentView’i çağırmadan önce findViewById aracılığıyla bir View bulmaya çalışmaktır. Tüm View öğeleri düzen genişletme anında oluşturulur, bu nedenle setContentView’dan önce yapılan herhangi bir findViewById çağrısı null döndürür ve View’i kullanmaya çalışırken NullPointerException’a neden olur. Çözüm: kesin sıra — önce super, sonra setContentView, ardından findViewById veya ViewBinding.
Ağdan veri yükleme, veritabanından okuma veya büyük dizileri doğrudan onCreate içinde işleme, ilk karenin oluşturulmasını engeller. Kullanıcı onCreate tamamlanana kadar siyah bir ekran görür ve bu, uygulama hızı algısını bozar. Çözüm: eşzamansız işlemler için lifecycleScope.launch kullanın, yükleme tamamlanana kadar bir iskelet (UI placeholder) görüntüleyin.
Ekran dönüşünde Bundle’dan durumu geri yüklemezseniz, kullanıcı kaydedilmemiş tüm girdileri kaybeder: form alanlarındaki metin, kaydırma konumu, seçili öğeler. Çözüm: durum kaybı olası görünmese bile, verileri geri yüklemek için onCreate’te her zaman savedInstanceState != null’u kontrol edin.
onCreate’teki anonim sınıflar ve lambdalar, bir Activity yok edildikten sonra bile örtük olarak Activity’ye bir referans tutabilir. Örneğin, onCreate’te oluşturulan bir Handler, Activity yok edildikten sonra bile ertelenmiş görevleri yürütmeye devam eder. Çözüm: yok etme sırasında görevleri otomatik olarak iptal eden LifecycleObserver, ViewModel ve lifecycleScope kullanın.
Fragment.onCreate’te View başlatmak mantıksal bir hatadır, çünkü View, onCreate çağrılmadan yeniden oluşturulabilir. Bir dinleyiciyi onCreate’te ayarlar ancak View’i onCreateView’de bağlarsanız, dinleyici yeniden oluşturma sırasında eski View’de kalır. Çözüm: tüm View ile ilgili işleri onViewCreated’te gerçekleştirin, onCreate’i yalnızca veri katmanı başlatması için bırakın.
Sıkça Sorulan Sorular
Evet, onCreate’i geçersiz kılmak zorunludur kullanıcı arayüzü görüntüleyen herhangi bir Activity için. Bu olmadan, setContentView çağırmak ve XML düzenini yüklemek imkansızdır. Activity’nin UI’sı yoksa (örneğin şeffaf bir Activity taslağı), onCreate yine de geçersiz kılınır, ancak setContentView çağrılmaz.
Hayır, onCreate aynı Activity örneği için tekrar çağrılamaz. Activity yok edilir ve yeniden oluşturulursa (ekran dönüşü, bellek yetersizliği), bu yeni bir onCreate çağrısı olan yeni bir örnektir. Bir istisna, Activity’yi zorla yok edip yeniden oluşturan recreate() yöntemidir, ancak bu yeni bir örneğin yeniden oluşturulmasıdır.
super.onCreate(savedInstanceState) öğesini çağırmazsanız, Android Runtime bir SuperNotCalledException fırlatır ve uygulama çöker. Sistem, geçersiz kılınan her yaşam döngüsü yönteminin kendi super sürümünü çağırmasını kesinlikle talep eder — bu, dahili durum makinesinin doğru çalışmasını sağlar.
Temel fark: Activity’deki onCreate, setContentView üzerinden UI’yı yüklerken, Fragment’teki onCreate yalnızca verileri başlatır. Fragment, View’i ayrı bir yöntem olan onCreateView’de oluşturur ve bu yöntem birden çok kez çağrılabilir (örneğin sekmeler değiştirilirken), Fragment onCreate ise Fragment örneği ömrü boyunca bir kez çağrılır.
onCreate’te başlatılan veriler Activity veya Fragment sınıfının alanlarında saklanır. Örneğin, private lateinit var binding: ActivityMainBinding sınıf düzeyinde bildirilir, onCreate’te başlatılır ve sonraki tüm yöntemlerde kullanılabilir. Ekran dönüşünde hayatta kalması gereken veriler için LiveData veya StateFlow ile ViewModel kullanın.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun