Activity Lifecycle, Android tərəfindən Activity-nin vəziyyətlər arasında keçidi zamanı çağırılan geri çağırma metodları toplusudur: yaradılma, görünmə, fokus, qismən görünmə itkisi, tam gizlənmə və məhvetmə. Sistem hər proqram ekranının həyat dövrünü onCreate() çağırışından başlayaraq onDestroy()-yə qədər idarə edir. Bu vəziyyətləri başa düşmək stabil Android proqramı üçün məcburi tələbdir, çünki metodlar arasında keçidin səhv idarə edilməsi yaddaş sızıntılarına, istifadəçi məlumatlarının itkisinə və gözlənilməz çöküşlərə səbəb olur. Android arxitekturası haqqında daha ətraflı Android haqqında ümumi məqalədə oxuyun.
Əsas olanlar
Activity Lifecycle (Activity həyat dövri) — Android proqramının hər ekranının yaradılma anından tam məhvinə qədər keçdiyi vəziyyət avtomatıdır. Android sistemi bu prosesi istifadəçi hərəkətləri əsasında idarə edir: proqramı açma, kiçültmə, ekranı fİrlama, daxil olan zəngə cavab vermə, proqramlar arasında keçid etmə və işi bitirmə.
Həyat dövrünü başa düşmək hər bir Android tərtibatçısı üçün zəruridir, çünki sistem yaddaş çatışmazlığı zamanı istənilən anda Activity-ni məhv edə bilər — və proqram öz vəziyyətini düzgün bərpa etməlidir. Google Android Vitals (2025) məlumatlarına görə, onSaveInstanceState()-də vəziyyət qorunmasını idarə etməyən proqramlar Activity yenidən yaradılarkən 42% daha çox çöküş göstərir.
Həyat dövri altı əsas geri çağırma metodunu əhatə edir: onCreate(), onStart(), onResume(), onPause(), onStop(), onDestroy(). Əlavə olaraq onRestart() metodu var, o, onStart()-dan əvvəl, Activity dayandırılmış vəziyyətdən qayıtdıqda çağırılır. Hər metodun ciddi müəyyən edilmiş təyinatı və icra müddəti var — sistem onları ardıcıl çağırır, tərtibatçı isə öz məntiqini yerinə yetirmək üçün onlardan hər hansını yenidən təyin edə bilər.
Dövrü üç əsas mərhələyə bölmək olar: bütün ömür müddəti (onCreate → onDestroy), görünən ömür müddəti (onStart → onStop) və ön planda ömür müddəti (onResume → onPause). Bu üç səviyyəni başa düşmək başlanğıc qurma və resursların azad edilməsi kodunu düzgün bölməyə kömək edir.
Həyat dövrinin hər metodu ciddi müəyyən edilmiş tapşırığı yerinə yetirir. Sistem onları sabit ardıcıllıqla çağırır, tərtibatçı isə yalnız konkret məntiq üçün lazım olan metodları yenidən təyin etməlidir. Həyat dövri metodlarının birbaşa çağırılması tövsiyə edilmir — bununla Android Runtime məşğul olur.
Proqramı işə salarkən tipik ardıcıllıq: onCreate → onStart → onResume. “Geri” düyməsini basdıqda: onPause → onStop → onDestroy. Kiçültdükdə: onPause → onStop, sonra qayıdarkən: onRestart → onStart → onResume.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
override fun onStart() {
super.onStart()
}
override fun onResume() {
super.onResume()
}
override fun onPause() {
super.onPause()
}
override fun onStop() {
super.onStop()
}
override fun onDestroy() {
super.onDestroy()
}
override fun onRestart() {
super.onRestart()
}
}
Hər yenidən təyin edilmiş metod super-versiyasını çağırmalıdır — bu olmadan sistem vəziyyətlər arasında keçidi düzgün başa çatdıra bilməyəcək. Bu qayda Android Developers sənədləşdirilməsində qeyd edilmişdir və Android Studio-nun lint qaydaları ilə yoxlanılır.
Birinci səviyyə — bütün ömür müddəti (entire lifetime): onCreate ilə onDestroy arasındakı dövr. Burada birdəfəlik başlanğıc qurma və qlobal resursların son azad edilməsi həyata keçirilir. İkinci səviyyə — görünən ömür müddəti (visible lifetime): onStart ilə onStop arasında. Activity ekranda görünür, lakin qismən başqa pəncərə ilə örtülə bilər. Üçüncü səviyyə — ön planda ömür müddəti (foreground lifetime): onResume ilə onPause arasında. Activity tapşırıq yığınının ən yuxarısındadır və istifadəçi ilə qarşılıqlı əlaqədədir.
onCreate() — Activity həyat dövrinin ilk və yeganə məcburi metodu. Sistem tərəfindən Activity nümunəsi yaradılarkən bir dəfə çağırılır. Bu metod savedInstanceState: Bundle? parametrini qəbul edir, o, əgər Activity məhvdən sonra yenidən yaradılırsa — məsələn, ekran fİrlanarkən — əvvəlcə yaddaşa yazılmış vəziyyəti ehtiva edir.
onCreate daxilində aşağıdakı tapşırıqlar yerinə yetirilir: setContentView() vasitəsilə istifadəçi interfeysinin başlanğıc qurulması, findViewById() ilə View elementlərinin bağlanması, RecyclerView və ViewPager üçün adapterlərin konfiqurasiyası, savedInstanceState-dən vəziyyətin bərpası, ViewModel və LiveData-nın başlanğıc qurulması, klik və jest dinləyicilərinin qurulması. Metod mümkün qədər tez bitməlidir — uzun müddətli əməliyyatlar ilk kadrın render edilməsini bloklayır, bu da proqramın işə düşmə vaxtını artırır.
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_profile)
val userNameText: TextView = findViewById(R.id.user_name)
val loadButton: Button = findViewById(R.id.load_button)
if (savedInstanceState != null) {
userNameText.text = savedInstanceState.getString("user_name")
}
loadButton.setOnClickListener {
loadUserProfile()
}
}
Əgər Activity ilk dəfə yaradılırsa, savedInstanceState null bərabərdir. Ekran fİrlanmasından sonra yenidən yaradılarkən Bundle onSaveInstanceState()-də yaddaşa yazılmış məlumatları ehtiva edir. Null yoxlaması — istifadəçi tərəfindən daxil edilmiş məlumatları itirmədən UI-nı düzgün bərpa etmək üçün standart təcrübədir.
onStart() onCreate()-dan dərhal sonra və ya onRestart()-dan sonra, Activity istifadəçi üçün görünən olduqda çağırılır. Bu vəziyyətdə Activity hələ ön planda deyil və istifadəçi ilə qarşılıqlı əlaqədə ola bilməz, lakin onun istifadəçi interfeysi artıq ekranda görünür. Məsələn, proqramı işə salarkən onStart və onResume çağırışı arasında sistem interfeysin ilk kadrını render edir.
onStart metodunda adətən aşağıdakı hərəkətlər yerinə yetirilir: Activity görünərkən işləməli olan animasiyaların başladılması; BroadcastReceiver qeydiyyatı; geolokasiya xidmətlərinə və sensorlara qoşulma; ViewModel və ya Room-dan məlumatların yenilənməsi. Burada həmçinin proqram proses daxilində müştəri-server arxitekturasından istifadə edərsə, bindService() vasitəsilə Bound-xidmətlərinə qoşulma həyata keçirilir.
override fun onStart() {
super.onStart()
val locationManager = getSystemService(Context.LOCATION_SERVICE) as LocationManager
locationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER,
5000L,
10f,
locationListener
)
}
override fun onStop() {
super.onStop()
val locationManager = getSystemService(Context.LOCATION_SERVICE) as LocationManager
locationManager.removeUpdates(locationListener)
}
Əhəmiyyətli qayda: onStart-da qoşulmuş resurslar onStop-da azad edilməlidir. Bu, Activity ekranda görünmədikdə batareya və sistem resurslarını istehlak etməməsini təmin edir. Google Play Store yeniləmələrin moderasiyası zamanı proqramları LocationListener və digər sistem xidmətlərinin sızıntılarına görə yoxlayır.
onResume() — Activity-nin ön planda olduğu və istifadəçi ilə qarşılıqlı əlaqəyə hazır olduğu vəziyyətdir. Bu ekranın işçi vəziyyətidir: sistem Activity-yə daxiletmə fokusunu ötürür və bütün toxunma, klaviatura daxiletmə və jest hadisələri bu ekrana yönləndirilir. onResume metodu hər dəfə Activity ön plana qayıtdıqda çağırılır — başqa Activity bitdikdən sonra, dialoq pəncərəsi bağlandıqdan sonra, cihazın kilidi açıldıqdan sonra.
onResume-da yerinə yetirilir: onPause-da dayandırılmış animasiyaların bərpası; kamera və digər eksklüziv resursların açılması; sensor dinləyicilərinin qeydiyyatı (akselerometr, giroskop); UI üçün taymerlərin və saniyəölçənin başadılması; ekran məzmununun aktuallaşdırılması. onResume / onPause cütlüyündə yalnız fokus zamanı aktiv olmalı olan resurslarla işlənir — məsələn, davamlı nitq tanıma və ya video çəkiş.
override fun onResume() {
super.onResume()
cameraHolder.openCamera()
animator.resume()
sensorManager.registerListener(
stepCounter,
sensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER),
SensorManager.SENSOR_DELAY_NORMAL
)
}
override fun onPause() {
super.onPause()
cameraHolder.closeCamera()
animator.pause()
sensorManager.unregisterListener(stepCounter)
}
onStart və onResume arasındakı fərq əhəmiyyətlidir: Activity görünə bilər (onStart), lakin aktiv olmaya bilər (onResume) — məsələn, onun üzərində açılan dialoq pəncərəsi və ya şəffaf kilid ekranı olduqda. Məhz onResume-da, onStart-da yox, monopol giriş tələb edən eksklüziv resurslar açılmalıdır.
onPause() Activity daxiletmə fokusunu itirdikdə, lakin qismən görünər qaldıqda çağırılır. Tipik ssenarilər: dialoq pəncərəsinin açılması, “Son proqramlar” düyməsinin basılması, daxil olan zəng, “Ev” düyməsinin basılması (bu halda onPause-dan sonra onStop gələcək). onPause metodu — istifadəçinin itirməməli olduğu məlumatları yadda saxlamaq üçün son etibarlı yerdir.
onPause-da yerinə yetirilir: məktub və forma qaralamalarının Room və ya SharedPreferences-də yaddaşa yazılması; animasiyaların və video oxutmanın dayandırılması; kameranın bağlanması və monopol resursların azad edilməsi; fon üçün kritik olmayan bahalı əməliyyatların ləğv edilməsi. onPause metodu 100 millisaniyədən az müddətdə bitməlidir — sistem onPause idarəni qaytarmayana qədər növbəti Activity-yə keçidi bloklayır və limitin aşılması ANR-yə (Application Not Responding) səbəb olur.
override fun onPause() {
super.onPause()
val editor = SharedPreferences.Manager ...
editor.putString("draft_text", draftEditText.text.toString())
editor.apply()
videoView.pause()
cameraHolder.release()
}
Əhəmiyyətlidir: onPause UI axınında icra olunur, buna görə də sinxron sorğu ilə Room vasitəsilə məlumat bazasına yazmaq kimi bloklaşdırıcı əməliyyatlar asinxronlarla (korutinlər) və ya fon axınında yerinə yetirilməlidir. SharedPreferences üçün commit() əvəzinə apply() istifadə edin — apply məlumatları asinxron yazır və UI axınını bloklamır.
onStop() Activity istifadəçi üçün görünməz olduqda çağırılır. Bu aşağıdakı hallarda baş verir: Activity tamamilə başqa Activity ilə örtülübdür; istifadəçi “Ev” düyməsini basıb və ya başqa proqrama keçib; Activity sonlanır (sonra onDestroy çağırılacaq). onStop vəziyyətində Activity yaddaşda qalır və bütün sahələrini saxlayır — o, məhv edilməyib, lakin aktiv də deyil.
onStop-da yerinə yetirilir: onStart-da qeydiyyatdan keçirilmiş BroadcastReceiver-dən çıxma; Bound-xidmətlərdən ayrılma; LocationListener, SensorListener və digər sistem dinləyicilərinin azad edilməsi; proqram gizləndikdə ehtiyac olmayan uzunmüddətli fon əməliyyatların dayandırılması; onPause-da edilməyibsə, onSaveInstanceState() vasitəsilə Bundle-də cari UI vəziyyətinin yaddaşa yazılması.
override fun onStop() {
super.onStop()
unregisterReceiver(connectivityReceiver)
unbindService(serviceConnection)
if (isChangingConfigurations()) {
Log.d("Lifecycle", "Activity konfiqurasiya səbəbi ilə yenidən yaradılır")
}
}
Sistem yaddaş çatışmazlığı zamanı onDestroy çağırmadan onStop vəziyyətində Activity-ni məhv edə bilər. Buna görə bütün kritik məlumatlar onStop-a keçməzdən əvvəl yaddaşa yazılmalıdır. isChangingConfigurations() bayrağı onStop çağırışının ekranın fİrlanması ilə əlaqəli olub-olmadığını müəyyən etməyə imkan verir — bu halda Activity sonlanmayacaq, yenidən yaradılacaq.
onDestroy() — Activity tam məhv edilməzdən əvvəl çağırılan həyat dövrinün son metodu. Sistem onDestroy-u iki halda çağırır: Activity finish() çağırılması ilə sonlanır və ya istifadəçi “Geri” düyməsini basır; Activity konfiqurasiya dəyişikliyi (məsələn, ekranın fİrlanması) səbəbindən sistem tərəfindən məhv edilir və yenidən yaradılacaq. onDestroy metodu resursların son təmizlənməsini yerinə yetirməyə imkan verir: axınların və korutinlərin ayrılması, daimi açıq kursorların və soketlərin bağlanması, NDK vasitəsilə native yaddaşın azad edilməsi.
override fun onDestroy() {
super.onDestroy()
backgroundJob.cancel()
dbHelper.close()
if (isFinishing) {
Log.d("Lifecycle", "Activity tamamilə başa çatır")
} else {
Log.d("Lifecycle", "Activity yenidən yaradılacaq")
}
}
Əhəmiyyətli qeyd: onDestroy-un çağırılması təminat verilmir, əgər proqram prosesi sistem tərəfindən öldürülübsə (out-of-memory kill). Buna görə məlumatları yadda saxlamaq üçün onDestroy-a etibar etmək olmaz — bu tapşırıq onPause və ya onStop-da həll edilir. isFinishing xassəsi Activity-nin finish() ilə sonlanmasını konfiqurasiya dəyişikliyi zamanı yenidən yaradılmadan ayırmağa imkan verir.
onRestart() onStart()-dan əvvəl, Activity dayandırılmış vəziyyətdən (onStop) ön plana qayıtdıqda çağırılır. Bu, istifadəçi “Son proqramlar” menyusundan proqramı yenidən açdıqda və ya uşaq ekranında “Geri” basaraq Activity-yə qayıtdıqda baş verir. onRestart metodu onCreate-dən fərqli məntiqi yerinə yetirməyə imkan verir — məsələn, Activity gizləndikdə dəyişə biləcək məlumatları yeniləmək.
override fun onRestart() {
super.onRestart()
refreshDataFromNetwork()
Log.d("Lifecycle", "Activity yığından yenidən işə salınır")
}
Tipik ssenari: istifadəçi proqramı açdı, başqa tapşırığa keçdi və bir saat sonra qayıtdı. onRestart-da proqram məlumatların aktuallığını yoxlaya və əgər çox vaxt keçibsə, məzmunu yenidən yükləməyi təklif edə bilər. Bu, istifadəçi təcrübəsini yaxşılaşdırır və köhnəlmiş məlumatların göstərilmə ehtimalını azaldır.
Ekranın fİrlanması — Activity-nin yenidən yaradılmasının ən tez-tez rast gəlinən ssenarisidir. Defolt olaraq Android hər orientasiya dəyişikliyində cari Activity-ni məhv edir və yenisini yaradır. Vəziyyət yaddaşa yazılmasa, istifadəçi bütün daxil edilmiş məlumatları itirəcək. Bunun üçün Android iki mexanizm təmin edir: seriallaşdırıla bilən məlumatlar üçün onSaveInstanceState() və konfiqurasiya dəyişikliklərinə davam edən məlumatlar üçün ViewModel.
onSaveInstanceState() Activity məhv edilməzdən əvvəl müvəqqəti vəziyyəti yadda saxlamaq üçün çağırılır. Yaddaşa yazılmış məlumatlar onCreate-ə savedInstanceState parametri vasitəsilə və onStart-dan sonra çağırılan onRestoreInstanceState() metoduna ötürülür. Bundle ölçü məhdudiyyətinə malikdir — təxminən 500 KB, buna görə də böyük həcmli məlumatlar (məsələn, bitmap-lar) ViewModel vasitəsilə yaddaşa yazılır.
<!-- AndroidManifest.xml — oriyentasiyanın təsbiti -->
<activity android:name=".MainActivity"
android:configChanges="orientation|screenSize" />
android:configChanges vasitəsilə orientasiyanın təsbiti Activity-nin yenidən yaradılmasının qarşısını alır, lakin proqram hər iki orientasiyanı dəstəkləməlidirsə, bu anti-nümunə hesab olunur. Google-ın müasir tövsiyəsi — istifadəçinin UI-da daxil etdiyi məlumatlar üçün onSaveInstanceState ilə birlikdə ViewModel istifadə etmək.
Fragment Activity-yə bənzər öz həyat dövrinə malikdir, lakin əlavə metodlarla: onAttach, onCreate, onCreateView, onViewCreated, onStart, onResume, onPause, onStop, onDestroyView, onDestroy, onDetach. Fragment həmişə Activity daxilində mövcuddur və onun həyat dövri Activity-konteynerin həyat dövri ilɘ bağlıdır. Activity məhv edilərsə, Fragment də onun ardınca gedir.
Əsas fərq: Fragment yalnız komponentin vəziyyətini deyil, həm də View iyerarxiyasını idarə edir. onCreateView metodu fragmentin kök View-ni qaytarır, onDestroyView isə bu iyerarxiyanı məhv edir. Bu, Fragment-ə ekran fİrlanması zamanı Activity-nin yenidən yaradılmasından sağ çıxmağa imkan verir: Fragment qorunur, onun View-i isə onCreateView-də yenidən yaradılır.
class ProfileFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
return inflater.inflate(R.layout.fragment_profile, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val avatarImage: ImageView = view.findViewById(R.id.avatar_image)
loadAvatar(avatarImage)
}
}
onCreate və onCreateView arasındakı fərqi başa düşmək kritik əhəmiyyət daşıyır: onCreate Fragment-ın ömrü boyu bir dəfə çağırılır (hətta View yenidən yaradıldıqda belə), onCreateView isə Fragment öz View iyerarxiyasını hər yaratdıqda və ya yenidən yaratdıqda çağırılır. Məlumatların başlanğıc qurulması onCreate-də, UI bağlanması isə onViewCreated-da yerinə yetirilir.
LifecycleObserver — Android Jetpack kitabxanasının komponenti, Activity və ya Fragment-də metodları yenidən təyin etmədən həyat dövri dəyişikliklərinə reaksiya verməyə imkan verir. Həyat dövri metodlarının hər birində kodu təkrarlamaq əvəzinə, tərtibatçı @OnLifecycleEvent annotasiyaları ilə ayrıca sinif yaradır və onu lifecycle.addObserver()-yə ötürür.
Jetpack həmçinin LifecycleOwner sinfini təmin edir — AppCompatActivity və Fragment tərəfindən tətbiq edilən interfeys. LifecycleOwner tətbiq edən hər bir obyekt LiveData abunələrini, lifecycleScope vasitəsilə korutinləri və WorkManager işini həyat dövri ilɘ əlaqəli idarə edə bilər. Bu, MVVM və Jetpack-ə əsaslanan müasir Android arxitekturasının təməl daşıdır.
class MyLocationObserver(private val context: Context) : DefaultLifecycleObserver {
override fun onStart(owner: LifecycleOwner) {
startLocationUpdates()
}
override fun onStop(owner: LifecycleOwner) {
stopLocationUpdates()
}
}
// Activity-də:
lifecycle.addObserver(MyLocationObserver(this))
DefaultLifecycleObserver istifadəsi test etməni asanlaşdırır, kod təkrarlanmasını azaldır və həyat dövri məntiqini müxtəlif ekranlar arasında təkrar istifadə edilən edir. Bu, hər Activity-də onStart/onStop-un əl ilə yenidən təyin edilməsinin müasir əvəzidir. IT Sectr tərəfindən hazırlanmış Android proqramlarında biz LifecycleObserver-dan geolokasiya, Bluetooth skan etmə və analitika üçün istifadə edirik — bu, boilerplate kodun həcmini 30–40% azaldır.
Tez-tez verilən suallar
Əgər super.onCreate() və ya hər hansı digər super həyat dövri metodunu çağırmasanız, sistem SuperNotCalledException istisnası atacaq və proqram çökəcək. Bu, Android Runtime-ın sərt tələbidir — hər metod icranı baza sinfinə həvalə etməlidir, əks halda daxili vəziyyət avtomatı növbəti vəziyyətə keçə bilməyəcək.
Activity ekran fİrlanarkən yenidən yaradılır, çünki orientasiya dəyişikliyi cihaz konfiqurasiyasının dəyişikliyidir (configuration change). Defolt olaraq Android Activity-ni məhv edir və alternativ resursları (layout-land, values-land) yükləmək üçün yenisini yaradır. Yenidən yaratmanı söndürmək üçün manifestdə android:configChanges atributu əlavə edilə bilər, lakin Google məlumatları saxlamaq üçün ViewModel istifadə etməyi tövsiyə edir.
Kritik məlumatlar onPause()-‐da yaddaşa yazılır, çünki bu, proqramın sistem tərəfindən öldürülməsindən əvvəl zəmanətlə çağırılan son metoddur. onStop və onDestroy-dan sonra sistem əlavə metodlar çağırmadan prosesi sonlandıra bilər. Qaralamalar və aralıq məlumatlar üçün SharedPreferences-dən apply() ilɘ və ya Room-dan korutinlərlɘ istifadə edin.
onPause Activity fokus itirdikdə, lakin qismən görünər qaldıqda çağırılır (məsələn, dialoq pəncərəsi açılıb). onStop Activity tamamilə ekrandan gizləndikdə çağırılır (başqa Activity və ya “Ev” düyməsi). Əsas praktiki fərq: onPause — məlumatların saxlanması üçün son nöqtə, onStop — fonda ehtiyac olmayan dinləyicilərin və sistem xidmətlərinin azad edilməsi yeri.
ViewModel — Android Jetpack komponenti, UI məlumatlarını saxlayır və konfiqurasiya dəyişikliklərinə (ekranın fİrlanması) avtomatik davam edir. ViewModel Activity yenidən yaradıldıqda məhv edilmir: o, LifecycleOwner (Activity və ya Fragment) tamamilɘ sonlanana qədər yaşayır. Bu, Bundle və onSaveInstanceState istifadə etmədən ekran fİrlanması zamanı məlumatların saxlanması problemini həll edir. ViewModel Google tərəfindən tövsiyə edilən MVVM arxitekturasının məcburi elementidir.
Nəticə
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