onCreate — bu nədir, Android-də Activity inicializasiyası

Müəllif: IT Sectr Dərc olunub: 2026-03-03 Oxuma vaxtı: 10 dəq

onCreate — Android-də Activity və Fragment-in həyat dövrünün ilk və yeganə məcburi metodudur. Sistem komponent yaradılarkən onu bir dəfə çağırır, əvvəllər saxlanmış vəziyyəti olan Bundle parametrini ötürür. onCreate daxilində tərtibatçı istifadəçi interfeysini inicializasiya edir, View elementlərini bağlayır, hadisə idarəedicilərini konfiqurasiya edir və savedInstanceState-dən məlumatları bərpa edir. onCreate-in düzgün tətbiqi olmadan heç bir Android tətbiqi işə salına bilməz — bu hər ekran üçün giriş nöqtəsidir. Activity-nin ümumi həyat dövrü haqqında daha ətraflı Activity Lifecycle məqaləsində oxuyun.

Əsas məqamlar

  • onCreate — həyat dövrünün ilk və yeganə məcburi metodu; Activity və ya Fragment yaradılarkən bir dəfə çağırılır
  • Bundle parametri — savedInstanceState onSaveInstanceState-də saxlanmış məlumatları və ya Activity ilk dəfə yaradılırsa null ehtiva edir
  • setContentView — Activity üçün onCreate daxilində məcburi çağırış; XML düzülüşünü kodla əlaqələndirir
  • UI inicializasiyası — findViewById, RecyclerView adapterlərinin qurulması, klik dinləyicilərinin təyini — onCreate-in tipik vəzifələri
  • Fragment.onCreate — Activity-dən fərqlənir: burada setContentView çağırılmır, düzülüş onCreateView vasitəsilə ötürülür
  • Vaxt məhdudiyyəti — onCreate 5 saniyə ərzində bitməlidir (ANR həddi), uzun müddətli əməliyyatlar fon axınına köçürülür
  • ViewModel və onCreate — onCreate-də ViewModel-in inicializasiyası məlumatların ekran dönməsində itkisiz qalmasına imkan verir

Android-də onCreate nədir

onCreate — Android-in yeni Activity və ya Fragment nümunəsi yaradarkən çağırdığı geri çağırış (callback) metodudur. Bu istifadəçi ekranı koduna ilk giriş nöqtəsidir: onCreate çağırılmazdan əvvəl heç bir istifadəçi kodu icra olunmur. Sistem metoda Bundle parametrini ötürür, o ya əvvəllər saxlanmış məlumatları ehtiva edir (yenidən yaradılarkən), ya da null-dur (ilk işə salındıqda).

onCreate metodu android.app.Activity sinfində və androidx.fragment.app.Fragment sinfində təyin edilmişdir. Hər iki variant oxşar vəzifələri yerinə yetirir: komponentin inicializasiyası, UI-nin qurulması və vəziyyətin bərpası. Lakin konkret tətbiq fərqlənir — Activity düzülüşü yükləmək üçün setContentView istifadə edir, Fragment isə onCreateView vasitəsilə View qaytarır. Tərtibatçı Activity-də ən azı onCreate-i dəyişdirməlidir — onsuz Android ekranı göstərə bilməz.

onCreate Activity nümunəsinin tam həyat dövrü ərzində ciddi şəkildə bir dəfə çağırılır. Hətta ekran dönəndə belə, yeni Activity nümunəsi əvvəlki nümunənin Bundle-i ilə birlikdə yeni onCreate çağırışı alır. Bu xüsusiyyət onCreate-i birdəfəlik inicializasiya üçün ideal yer edir: məlumatların yüklənməsi, adapterlərin yaradılması, Dagger və ya Hilt vasitəsilə DI komponentlərinin qurulması.

Activity-də onCreate

Activity-də onCreate metodu dörd əsas vəzifəni yerinə yetirir: layout düzülüşünün yüklənməsi, View elementlərinin inicializasiyası, Bundle-dən vəziyyətin bərpası və ilkin hadisə idarəedicilərinin qurulması. onCreate-də məcburi minimal kod — super.onCreate(savedInstanceState)setContentView(R.layout.activity_main) çağırışıdır.

kotlin
class MainActivity : AppCompatActivity() {
    private var binding: ActivityMainBinding? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // ViewBinding — findViewById-in müasir əvəzedicisi
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding?.root)

        // Binding ilə inicializasiya
        binding?.apply {
            welcomeText.text = getString(R.string.welcome)
            startButton.setOnClickListener { startGame() }
        }

        // Vəziyyətin bərpası
        if (savedInstanceState != null) {
            score = savedInstanceState.getInt("score", 0)
            binding?.scoreText?.text = score.toString()
        }
    }
}

Müasir təcrübə — findViewById əvəzinə ViewBinding istifadə etməkdir. ViewBinding kompilasiya mərhələsində ActivityMainBinding sinfini yaradır, bu da səhv ID-lərlə bağlı xətaları aradan qaldırır və şablon kodun həcmini azaldır. Google Android Studio 3.6-dan başlayaraq ViewBinding-i Activity və Fragment-də View-ə girişin standart yolu kimi tövsiyə edir.

onCreate-də hərəkətlərin ardıcıllığı ciddi olmalıdır: əvvəlcə super, sonra setContentView, daha sonra qalan hər şey. setContentView-dən əvvəl findViewById çağırmaq null qaytaracaq — düzülüş hələ yüklənməyib və View elementləri iyerarxiyada mövcud deyil. Bu, başlanğıc Android tərtibatçılarının ən çox yayılmış səhvlərindən biridir.

Fragment-də onCreate

Fragment-də onCreate Activity-dən fərqlənir: burada setContentView çağırılmır, yalnız UI ilə əlaqəli olmayan məlumatların inicializasiyası aparılır. Fragment komponentin yaradılmasını və View-in yaradılmasını iki ayrı metoda bölür: onCreate (bir dəfə çağırılır) və onCreateView (View hər yaradılanda və ya yenidən yaradılanda ç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 inicializasiyası — View-in yenidən yaradılmasını keçəcək
        viewModel = ViewModelProvider(this)[UserViewModel::class.java]

        // FragmentManager-dən arqumentlər
        arguments?.let {
            viewModel.loadUser(it.getString("user_id") ?: "")
        }

        // Dönmə zamanı qorunma
        retainInstance = true
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        binding = FragmentUserListBinding.inflate(inflater, container, false)
        return binding!!.root
    }
}

Activity və Fragment onCreate arasında əsas fərq: Fragment-də onCreate View ilə əlaqəli kodu ehtiva etməməlidir, çünki View məhv edilə və yenidən yaradıla bilər (məsələn, ViewPager tablarını dəyişərkən), onCreate isə yalnız bir dəfə çağırılır. Məlumatların yüklənməsi, ViewModel-in qurulması və adapterlərin inicializasiyası — onCreate-in vəzifələri, View-in bağlanması isə onViewCreated-in vəzifəsidir.

savedInstanceState və vəziyyətin bərpası

onCreate-də savedInstanceState parametri — Activity və ya Fragment-in müvəqqəti vəziyyətinin saxlanması və bərpası mexanizmidir. Sistem Activity-ni məhv etdikdə (ekran dönməsi, yaddaş çatışmazlığı), onSaveInstanceState()-i çağırır, ona tərtibatçı Bundle-də açar-dəyər cütü yerləşdirir. Yeni nümunə yaradılarkən bu Bundle onCreate-də qaytarılır.

Bundle aşağıdakı məlumat növlərini dəstəkləyir: String, Integer, Boolean, Long, Float, Double, onların massivləri, həmçinin Parcelable və Serializable obyektləri. Mürəkkəb obyektlər üçün Parcelable istifadə olunur — bu, Android-ə xas olan daha məhsuldar serializasiya mexanizmidir. Bundle ölçüsü təxminən 500 KB ilə məhdudlaşır — limiti aşmaq TransactionTooLargeException istisnasına səbəb 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)
}

Bunu başa düşmək vacibdir: onSaveInstanceState istifadəçi Activity-ni finish() və ya “Geri” düyməsi ilə bağladıqda çağırılmır. Sistem hesab edir ki, bu halda istifadəçi şüurlu şəkildə işi bitirir və vəziyyətin saxlanması tələb olunmur. Buna görə də uzunmüddətli məlumat saxlanması üçün yalnız savedInstanceState-ə güvənmək olmaz — Room, DataStore və ya SharedPreferences istifadə edin.

OnCreate-in vaxtı və məhdudiyyətləri

onCreate əsas (UI) axınında icra olunur və sistem onun bitməsini gözləyir, sonra Activity-ni ekranda göstərir. onCreate 5 saniyədən çox çəkərsə, sistem ANR (Application Not Responding) dialoq qutusunu göstərir və istifadəçiyə tətbiqi bağlamağı təklif edir. Şəbəkədən məlumat yükləmə və ya verilənlər bazasından oxuma kimi uzun müddətli əməliyyatlar fon axınına köçürülməlidir.

Google Android Performance (2025) tövsiyələrinə görə, onCreate orta seqment cihazlarında 1 saniyədən az müddətdə bitməlidir. Bunun üçün: lazy inicializasiyadan (Kotlin-də lazy deleqatı) istifadə edin, ağır məlumatların yüklənməsini onResume və ya korutinlər vasitəsilə təxirə salın, nadir istifadə olunan UI komponentləri üçün ViewStub tətbiq edin, başlanğıc vaxtını Android Vitals vasitəsilə profilləşdirin.

kotlin
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    // Lazy inicializasiya — obyekt yalnız ilk müraciətdə yaradılır
    val heavyData by lazy {
        HeavyDataLoader.load()
    }

    // Fon axınında lifecycleScope vasitəsilə məlumat yükləmə
    lifecycleScope.launch(Dispatchers.IO) {
        val users = userDao.getAllUsers()
        withContext(Dispatchers.Main) {
            adapter.submitList(users)
        }
    }
}

Profilləşdirmə alətləri: Android Studio Profiler (CPU vərəqi) hər metodun dəqiq icra vaxtını göstərir. Android Vitals-də (Google Play konsolu) “Soyuq başlanğıc vaxtı” metrikasını izləmək olar — Activity-nizin onCreate-i 500 ms-dən çox olarsa, konsol bunu performans problemi kimi qeyd edir. Biz IT Sectr-də CI-pipeline-da hər Activity-nin başlanğıc vaxtını avtomatik idarə etmək üçün Macrobenchmark testlərindən istifadə edirik.

ViewModel və onCreate

ViewModel — onCreate-də ekran dönməsini keçməli olan məlumatların inicializasiyası üçün ən yaxşı üsuldur. ViewModel onCreate-də ViewModelProvider vasitəsilə yaradılır və konfiqurasiya dəyişikliyi zamanı avtomatik saxlanılır. Activity dönmədən sonra yenidən yaradıldıqda, ViewModel yaddaşda qalır və onCreate məlumat itkisi olmadan eyni ViewModel-i alır.

kotlin
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_profile)

    // ViewModel bir dəfə yaradılır və konfiqurasiya dəyişikliklərini keçir
    val viewModel: ProfileViewModel =
        ViewModelProvider(this)[ProfileViewModel::class.java]

    // LiveData müşahidəsi — UI məlumat dəyişdikdə avtomatik yenilənir
    viewModel.user.observe(this) { user ->
        binding?.userName?.text = user.name
        binding?.userEmail?.text = user.email
    }

    // ViewModel yeni yaradılıbsa məlumat yükləmə
    if (savedInstanceState == null) {
        viewModel.loadProfile(userId)
    }
}

ViewModel + LiveData/StateFlow kombinasiyası ekran dönməsi problemini Bundle-də əl ilə saxlama olmadan həll edir. ViewModel məlumatları yaddaşda saxlayır, LiveData yenidən yaratma zamanı Activity-ni avtomatik yenidən abunə edir, StateFlow (Kotlin Coroutines-dən) isə korutin dəstəyi ilə reaktivlik əlavə edir. Bu, Google tərəfindən Guide to App Architecture təlimatında tövsiyə olunan standart arxitekturadır.

OnCreate ilə işdə ümumi səhvlər

Hətta təcrübəli tərtibatçılar onCreate-də tipik səhvlərə yol verirlər. Ən çox yayılmış beş problemi və onlardan qaçınma yollarını nəzərdən keçirək.

setContentView-dən əvvəl View ilə iş

Ən çox yayılmış səhv — setContentView çağırılmazdan əvvəl findViewById vasitəsilə View tapmağa cəhd etməkdir. Bütün View elementləri düzülüşün inflyasiyası anında yaradılır, buna görə də setContentView-dən əvvəl findViewById-ə hər hansı müraciət null qaytarır və View-dən istifadə etməyə cəhd etdikdə NullPointerException-a səbəb olur. Həll yolu: ciddi ardıcıllıq — əvvəlcə super, sonra setContentView, daha sonra findViewById və ya ViewBinding.

UI axınının uzun müddətli əməliyyatlarla bloklanması

Şəbəkədən məlumat yükləmə, verilənlər bazasından oxuma və ya böyük massivlərin birbaşa onCreate-də işlənməsi ilk kadrın renderini bloklayır. İstifadəçi onCreate bitənə qədər qara ekran görür, bu da tətbiqin sürət qavrayışını pisləşdirir. Həll yolu: asinxron əməliyyatlar üçün lifecycleScope.launch istifadə edin, yükləmə bitənə qədər skelet (placeholder UI) göstərin.

savedInstanceState-ə məhəl qoymama

Ekran dönəndə Bundle-dən vəziyyət bərpa edilməzsə, istifadəçi bütün yazılmamış daxiletməni itirir: forma sahələrindəki mətn, sürüşdürmə mövqeyi, seçilmiş elementlər. Həll yolu: məlumatları bərpa etmək üçün onCreate-də həmişə savedInstanceState != null yoxlayın, hətta vəziyyət itkisinin mümkünsüz göründüyü hallarda belə.

Anonim siniflər vasitəsilə yaddaş sızması

OnCreate-də anonim siniflər və lambdalar Activity məhv edildikdən sonra ona gizli istinad saxlaya bilər. Məsələn, onCreate-də yaradılmış Handler Activity məhv edildikdən sonra da təxirə salınmış tapşırıqları icra etməyə davam edir. Həll yolu: LifecycleObserver, ViewModel və lifecycleScope istifadə edin, onlar məhv olma zamanı tapşırıqları avtomatik ləğv edir.

Fragment onCreate-də həddindən artıq inicializasiya

Fragment onCreate-də View-in inicializasiyası — məntiqi səhvdir, çünki View onCreate çağırılmadan yenidən yaradıla bilər. onCreate-də dinləyici qurulubsa və View onCreateView-də bağlanırsa, yenidən yaratma zamanı dinləyici köhnə View-də qalır. Həll yolu: bütün View işini onViewCreated-də yerinə yetirin, onCreate-i yalnız məlumat təbəqəsinin inicializasiyası üçün buraxın.

Tez-tez verilən suallar

Activity-də onCreate-i dəyişdirmək məcburidirmi?

Bəli, onCreate-in dəyişdirilməsi məcburidir istifadəçi interfeysini göstərən hər bir Activity üçün. Bu olmadan setContentView çağırmaq və XML düzülüşünü yükləmək mümkün deyil. Activity-nin UI-i yoxdursa (məsələn, şəffaf Activity-zastruplama), onCreate yenə də dəyişdirilir, lakin setContentView çağırılmadan.

OnCreate Activity məhv edilmədən təkrar çağırıla bilərmi?

Xeyr, onCreate eyni Activity nümunəsi üçün təkrar çağırıla bilməz. Activity məhv edilib yenidən yaradılırsa (ekran dönməsi, yaddaş çatışmazlığı), bu artıq yeni onCreate çağırışı olan yeni nümunədir. İstisna — recreate() metodu, Activity-ni məcburi məhv edib yenidən yaradır, lakin bu da yeni nümunənin yaradılmasıdır.

super.onCreate çağırılmasa nə baş verir?

super.onCreate(savedInstanceState) çağırılmasa, Android Runtime SuperNotCalledException istisnası atır və tətbiq çökür. Sistem hər dəyişdirilmiş həyat dövrü metodunun öz super versiyasını çağırmasını ciddi şəkildə tələb edir — bu, daxili vəziyyət maşınının düzgün işləməsini təmin edir.

Activity-də onCreate Fragment-də onCreate-dən nə ilə fərqlənir?

Əsas fərq: Activity-də onCreate UI-ni setContentView vasitəsilə yükləyir, Fragment-də onCreate isə yalnız məlumatları inicializasiya edir. Fragment View-i ayrıca onCreateView metodunda yaradır, bu metod çox dəfə çağırıla bilər (məsələn, tabları dəyişərkən), Fragment onCreate isə Fragment nümunəsinin ömrü boyu bir dəfə çağırılır.

OnCreate-dən digər metodlara məlumatları necə ötürmək olar?

OnCreate-də inicializasiya edilmiş məlumatlar Activity və ya Fragment sinfinin sahələrində saxlanılır. Məsələn, private lateinit var binding: ActivityMainBinding sinif səviyyəsində elan edilir, onCreate-də inicializasiya edilir və bütün sonrakı metodlarda əlçatan olur. Ekran dönməsini keçən məlumatlar üçün ViewModel-dən LiveData və ya StateFlow ilə istifadə edin.

Xülasə

  • onCreate — həyat dövrünün məcburi metodu, Activity və ya Fragment yaradılarkən bir dəfə çağırılır
  • setContentView — Activity üçün məcburi çağırış, XML düzülüşünü yükləyir; Fragment üçün düzülüş onCreateView vasitəsilə yüklənir
  • savedInstanceState — yenidən yaratma zamanı saxlanmış vəziyyəti olan Bundle; ilk işə salındıqda null
  • Vaxt məhdudiyyəti — onCreate 1 saniyədən az icra olunmalıdır, uzun əməliyyatlar korutinlərə köçürülür
  • ViewModel — onCreate-də ViewModel-in inicializasiyası ekran dönməsində məlumat itkisi problemini həll edir
  • Fragment vs Activity — Fragment onCreate UI kodu ehtiva etmir, Activity onCreate setContentView vasitəsilə düzülüşü yükləyir
  • Beş tipik səhv — setContentView-dən əvvəl View ilə iş, UI bloklanması, Bundle-ə məhəl qoymama, yaddaş sızmaları, Fragment.onCreate-də UI kodu

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun