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 — 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 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) və setContentView(R.layout.activity_main) çağırışıdır.
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 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).
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.
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.
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 ə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.
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 — 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.
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.
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.
Ə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.
Şə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.
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ə.
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ə 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
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.
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(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.
Ə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ə 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ə
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.
Həm də oxuyun