onCreate — nedir, Android’de Activity başlatma

Yazar: IT Sectr Yayınlanma: 2026-03-03 Okuma süresi: 10 dk

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 — ilk ve tek zorunlu yaşam döngüsü yöntemi; bir Activity veya Fragment oluşturulurken bir kez çağrılır
  • Bundle parametresi — savedInstanceState, onSaveInstanceState’da kaydedilen verileri veya Activity ilk kez oluşturuluyorsa null içerir
  • setContentView — Activity için onCreate içinde zorunlu çağrı; XML düzenini kodla bağlar
  • UI başlatma — findViewById, RecyclerView bağdaştırıcılarını ayarlama, tıklama dinleyicileri ayarlama — tipik onCreate görevleri
  • Fragment.onCreate — Activity’den farklıdır: burada setContentView çağrılmaz, düzen onCreateView üzerinden iletilir
  • Zaman sınırı — onCreate 5 saniye içinde tamamlanmalıdır (ANR eşiği), uzun işlemler arka plan iş parçacığına taşınır
  • ViewModel ve onCreate — onCreate’te ViewModel başlatma, verilerin ekran dönüşünde kayıpsız olarak hayatta kalmasını sağlar

Android’de onCreate Nedir

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

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.

kotlin
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

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).

kotlin
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.

savedInstanceState ve Durum Geri Yükleme

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.

kotlin
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 Zamanlaması ve Sınırlamaları

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.

kotlin
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 ve onCreate

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.

kotlin
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.

onCreate ile Çalışırken Sık Yapılan Hatalar

Deneyimli geliştiriciler bile onCreate’te tipik hatalar yapar. En yaygın beş soruna ve bunlardan nasıl kaçınılacağına bakalım.

setContentView’den Önce View ile Çalışmak

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.

Uzun İşlemlerle UI İş Parçacığını Bloke Etme

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.

savedInstanceState’ı Görmezden Gelme

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.

Anonim Sınıflar Yoluyla Bellek Sızıntıları

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 Aşırı Başlatma

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

Activity’de onCreate’i geçersiz kılmak zorunlu mu?

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.

OnCreate, Activity yok edilmeden tekrar çağrılabilir mi?

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 çağrılmazsa ne olur?

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.

Activity’deki onCreate, Fragment’teki onCreate’ten nasıl farklıdır?

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.

Veriler onCreate’ten diğer yöntemlere nasıl aktarı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

  • onCreate — zorunlu bir yaşam döngüsü yöntemi, bir Activity veya Fragment oluşturulurken bir kez çağrılır
  • setContentView — Activity için zorunlu bir çağrı, XML düzenini yükler; Fragment için düzen onCreateView üzerinden yüklenir
  • savedInstanceState — yeniden oluşturma sırasında kaydedilmiş durumu içeren Bundle; ilk başlatmada null
  • Zaman sınırı — onCreate 1 saniyeden kısa sürede tamamlanmalı, uzun işlemler coroutine’lere taşınmalı
  • ViewModel — onCreate’te ViewModel başlatma, ekran dönüşünde veri kaybı sorununu çözer
  • Fragment vs Activity — Fragment.onCreate UI kodu içermez, Activity.onCreate setContentView üzerinden düzen yükler
  • Beş tipik hata — setContentView’den önce View ile çalışmak, UI’yı bloke etmek, Bundle’ı görmezden gelmek, bellek sızıntıları, Fragment.onCreate’te UI kodu

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.

Projeyi tartış

Ayrıca okuyun