Bura qədər biz biraz sadə formada müəyyən mövzuları əhatə edəcək məsələlərə baxdıq. Baxdıqlarımız, elədiklərimiz haqda sadə deyərkən, əlbətdəki hər biri hansısa bir real proyektdə istifadə edilir. Sadəcə məsələ təklikdə onların bir məna ifadə etməməsidi. Ümumi başlanğıc səviyyəsindən biraz daha yuxarılara çıxmaq üçün daha qarmaşıq, daha mürəkkəb mövzulara başlamaq lazımdır.
Bugünkü mövzumuz Activity-nin həyat dövrü olacaq. Fikir vermişdizsə köhnə yazılarımızda MainActivity, SecondActivity yaradırdıq. OnCreate daxilində müəyyən proseslər edirdik. Bax bu onCreate dediyimiz var ha, o da özüylüyndə activity-nin həyat dövrünün bir parçasıdır.
Gəlin əvvəl rəsmi səhifədə paylaşılmış bu dövrün şəklili izahına baxaq:
Şəkildən də göründüyü kimi Activity yaradılarkən OnCreate(), onStart(), onResume() metodları sırayla işə düşür. Nəticədə istifadəçi həmin səhifəni telefonunun ekranında görür. Activity-dən çıxıldıqda, başqa activityə keçid edildikdə onPause(), onStop() işə düşür, geri qayıdıldıqda onRestart() vasitəsiylə onStart()-a qayıdılır. Dialoqlara keçərkən onPause()-a keçib ardınca onResume() ilə davam edir. Activity öləndə isə onDestroy()-a düşür.
Bunları belə qısaca dedim, üstündən keçdik. Gəlin bir tədbiqetmə yazaq, ciddi şəkildə bunlara baxaq.
Zəhmət olmazsa, android studionu açıb hazırlayın. Mən adın qoyum: “MyActivityLifecyle“.
Indi 3 ədəd button əlavə edək, onların setOnClickListener-lərin qoşaq. Əlavə edilən kodlara burdan, hal hazırkı son formaya burdan baxa bilərsiniz.
İndi gəlin 1 ədəd başqa activity yaradaq, buttonların biri startActivity, digəri startForResultActivity olaraq həmin activity-ni intent vasitəsiylə açsın. Bir də dialog açdıraq digər button üçün də.
Əlavə edilən kodlara burdan, hal hazırkı son formaya burdan baxa bilərsiniz.
İndi gələk əsas məsələyə. Bayaqdan bu qədər özümüzü niyə yoruruq? “Activity Lifecycle” necə işlədiyinə baxmaq üçün. Haydi, son əlavələrimizi də edib, Log-ları artıraq, sonra oturaq proseslərə baxmağa.
@Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ... Log.e("ActivityLifecycle", "onCreate"); } @Override protected void onStart() { super.onStart(); Log.e("ActivityLifecycle", "onStart"); } @Override protected void onResume() { super.onResume(); Log.e("ActivityLifecycle", "onResume"); } @Override protected void onStop() { super.onStop(); Log.e("ActivityLifecycle", "onStop"); } @Override protected void onPause() { super.onPause(); Log.e("ActivityLifecycle", "onPause"); } @Override protected void onDestroy() { super.onDestroy(); Log.e("ActivityLifecycle", "onDestroy"); } @Override protected void onRestart() { super.onRestart(); Log.e("ActivityLifecycle", "onRestart"); }
– Etdiyimiz dəyişikliklərə burdan abxa bilərsiniz.
Gəlin başlayaq səhifənin ilk açılmasında. Tədbiqetməni işə salırıq və Log-lara baxırıq görək, ekranda tədbiqetmə görünən zaman, loglar bizə nə deyəcək?
Ardıcıllığımız belə oldu: onCreate(), onStart(), onResume().
Gəlin indi ilk buttonumuza klikləyib digər activity-ni açaq, sonra back düyməsin basıb geri qayıdaq görək nə baş verir:
Main-imiz onPause()-a düşür, SeconActivity-nin onCreate()-hissəsi bitdikdən sonra həmin activity ekranda görünür, nəticədə bizim MainActivity onStop()-a düşür. Geriyə qayıtdıqda isə onRestart(), onStart(), onResume().
Gəlin indi də startActivityForRresult olan buttonu işə salaq və metodların ardıcıllığına baxaq:
Bu səfər də oxşar proseslər bax şerdi. Digərindən tək fərqi əvvəlcə onActivityResult()-a düşüb, sonra onRestart()-a keçdi.
İndi sıra dialogda:
Dialog göründü, və getdi. Activity üçün heçnə dəyişmədi!.Bəs deyirdilər dialog falan çıxanda onPause()-a düşür ordan qayıdanda onResume()-a düşür? Hə, bax o bizim çağırdığımız dialoglara aid deyil. Digər tədbiqetmələrə aiddi. Messengerdən, whatsappdan mesaj gəlib popup dialoglar çıxanda olur:
Bəs telefonun üzərindəki “home” düyməsi basaraq tədbiqetmədən çıxsaq necə olar?
Bu zaman diqqət etdinizsə activity-miz onDestroy()-a düşmədi, sadəcə onStop() oldu. Telefonda düymə var ey açıq qalan tədbiqetmələri görmək üçün basırıq. Həmin hissədən tədbiqetməyə yenidən qayıda bilərik.
Bu zaman onDestroya düşmədiyi üçün onRestart-dan davam etdi. Əgər sistem ehtiyac duyara (RAM-da lazımınca yer qalmadıqda) özü tədbiqetməni onDestroy()-a sala bilər. O zaman yenidən onCreate()-dən başlayacaq hər şey.
Burda xüsusi bir qeyd. Bəzi telefonlarda RAM kiçik olduğu üçün sistem bir activity-dən başqa yerə keçəndə avtomatik onu onDestroy()-a salır.
Belə, ümid edirəm yazı sizin üçün faydalı olar.
Son olaraq, kodlara baxmaq üçün: Muzafferus/my-activity-lifecycle
—
*Bu hissə yazıya sonradan əlavə edilib.
Əlavə olaraq gəlin iki məsələni də yoxlayaq.
- Ekranı kilidə salsaq nə baş verəcək?
- 2. Ekranı tərs çevirsək nə baş verəcək?
İlk öncə kilidi yoxlayaq:
Sanki “Home” düyməsin basmış kimi olduq. Əvvəl onStop()-a düşdü, sora geri qayıdanda onRestart() activity-ni yenidən işə saldı.
İndi isə telefonu yan tərəfə çevirək və baxaq:
Maraqlı bir məqam yarandı. Activity onDestroy() oldu, sonradan yenidən yarandı. Burda vurğulanmalı məsələ – sizin activity-də hansısa bir user datası varsa, telefon yana çevrildikdə activity-niz destroy olduğu üçün data (informasiya) itə bilər. Nəzərə alın. Ya informasiyanı saxlayın, ya da activity-ni sadəcə portrait olaraq AndroidManifest-də təyin etmək lazımdır:
Bunun başqa bir yolu da var, qoy mən onSaveInstanceState
deyim, siz özünüz axtarıb araşdırın. Uğur olsun!