onRestart — mahiyyəti, Activity-nin həyat dövründə bərpası

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

onRestart — Android-də Activity həyat dövrü metodu, sistem tərəfindən Activity-nin Stopped vəziyyətindən Started vəziyyətinə qayıtmasından əvvəl çağırılır. onRestart, əvvəllər başqa ekran tərəfindən gizlədilmiş və ya fon-a salınmış Activity-nin istifadəçi üçün yenidən görünən olduğunu bildirir. onRestart-da tərtibatçı köhnəlmiş məlumatları yeniləyir, siyahıları yenidən yükləyir və Activity görünməz olduğu müddətdə dəyişmiş ola biləcək UI vəziyyətini bərpa edir. Google Android Vitals (2025) məlumatlarına görə, onRestart-dan məlumat yeniləmək üçün istifadə edən tətbiqlər ekrana qayıtdıqda 25% daha az səhv məlumat göstərmə halları nümayiş etdirir. Android Developers sənədləri onRestart-ı Activity-nin ekranda yenidən görünməsindən əvvəl hazırlıq mərhələsi kimi təsvir edir.

Əsas məqamlar

  • onRestart Activity Stopped vəziyyətindən qayıtdıqda, onStart və onResume-dən əvvəl çağırılır.
  • onRestart Activity-nin ilk yaradılmasında çağırılmır — yalnız gizlənmədən sonra təkrar göstərilməsində.
  • onRestart-ın əsas vəzifəsi Activity görünməz olduğu müddətdə dəyişmiş ola biləcək məlumatları yeniləməkdir.
  • onRestart process death zamanı çağırılmır — bu halda Activity onCreate vasitəsilə yenidən yaradılır.
  • onRestart-ın düzgün istifadəsi çoxtapşırıqlılıq və tətbiqlər arasında keçid zamanı istifadəçi təcrübəsini yaxşılaşdırır.

onRestart — Android həyat dövründə metodun mahiyyəti

onRestart — Android-in Activity görünməz Stopped vəziyyətindən yenidən görünən vəziyyətə qayıtdıqda, onStart-dan əvvəl çağırdığı callback metodudur. Bu metod unikaldır ki, yalnız Activity-nin təkrar göstərilməsində çağırılır — ilk instansiya yaradılmasında ardıcıllıq onRestart-ı keçərək onCreate ilə başlayır. Tam dövr: onCreate → onStart → onResume (ilk işə salma) və ya onRestart → onStart → onResume (təkrar göstərmə).

Android sistemi baxımından onRestart, Activity-nin qayıdışa hazırlaşmasına imkan verən optimallaşdırmadır: repozitoriyadan məlumatları yeniləmək, UI vəziyyətini sinxronlaşdırmaq, şəbəkə bağlantısını yoxlamaq. Fokus əldə edərkən hər dəfə çağırılan onResume-dən fərqli olaraq (o cümlədən dialoq və ya sistem menyusundan qayıtdıqda), onRestart yalnız tam gizlənmə-qayıdış dövründə işə düşür. Bu, onRestart-ı qismən fokus itkisi zamanı lazım olmayan „ağır“ yeniləmə əməliyyatları üçün ideal yer edir.

Android Activity həyat dövrü spesifikasiyasına görə, onStop və onRestart arasındakı vaxt intervalı bir neçə saniyədən (istifadəçi tez keçid etdi) bir neçə saata qədər (tətbiq fonda idi və istifadəçi qayıtdı) dəyişə bilər. Bu müddət ərzində uzaq mənbədəki (API, DB) məlumatlar dəyişmiş ola bilər, buna görə onRestart aktuallığı yoxlamaq üçün təbii nöqtədir.

onRestart nə vaxt çağırılır: şərtlər və ardıcıllıq

onRestart yalnız Activity-nin Stopped vəziyyətindən qayıtması zamanı çağırılır, Activity onStop çağırıldıqdan sonra Stopped vəziyyətinə keçir. Aşağıda onRestart-a səbəb olan bütün ssenarilər verilmişdir.

onRestart çağırılma ssenariləri:

  • Başqa Activity-dən qayıdış — istifadəçi yeni Activity açdı (məsələn, bildirişə kliklədi) və sonra geri qayıtdı („Geri“ düyməsini sıxdı). Stack: MainActivity.onPause → MainActivity.onStop → SecondActivity yaradılır → istifadəçi „Geri“ sıxır → SecondActivity.onPause → SecondActivity.onStop → SecondActivity.onDestroy → MainActivity.onRestart → MainActivity.onStart → MainActivity.onResume.
  • Kiçiltmədən qayıdış — istifadəçi tətbiqi kiçiltdi (Home) və bir müddət sonra qayıtdı. CurrentActivity.onPause → CurrentActivity.onStop → (tətbiq fonda) → istifadəçi qayıdır → CurrentActivity.onRestart → CurrentActivity.onStart → CurrentActivity.onResume.
  • Blok ekranından qayıdış — blok ekranı Activity-ni örtür; blok açıldıqdan sonra Activity onRestart alır, əgər əhəmiyyətli vaxt keçibsə (5 saniyədən çox).
  • Intent vasitəsilə işə salınmış tətbiqdən qayıdış — kamera, qalereya, brauzer — startActivityForResult() və ya ActivityResultLauncher vasitəsilə işə salınmış hər hansı üçüncü tərəf tətbiqi.

onRestart nə vaxt çağırılmır: ekran döndərmə zamanı (Activity məhv edilir və onCreate vasitəsilə yenidən yaradılır), dialoq pəncərəsindən qayıdışda (Activity onStop-a getmir, yalnız onPause → onResume), process death zamanı (Activity yenidən yaradılır).

onRestart və onCreate arasındakı fərq: nə seçməli

onRestart və onCreate Activity-nin bərpasına iki fərqli yanaşmadır. Aralarında seçim Activity-nin tamamilə məhv edilib-edilməməsindən və ya sadəcə gizlədilməsindən asılıdır.

XüsusiyyətonRestartonCreate
Nə vaxt çağırılırActivity Stopped-dan qayıdırActivity ilk dəfə və ya məhv olduqdan sonra yaradılır
Vəziyyət qorunubBəli — ViewModel və sahələr canlıdırXeyr — hər şey yenidən yaradılır
BundleÖtürülmürÖtürülür (savedInstanceState)
Tipik hərəkətlərMəlumat yeniləmə, UI yeniləməView-in işə salınması, LiveData-ya abunə
Çağırılma tezliyiHər qayıdışdaBir dəfə və ya məhv olduqdan sonra

Seçim qaydası: View-in işə salınması və LiveData/StateFlow-a abunəni onCreate-də (və ya Fragment üçün onViewCreated-də) edin. Məlumat yeniləmə, siyahıları yenidən yükləmə və vəziyyət yoxlamasını — onRestart-da. Əgər məlumatlar ViewModel vasitəsilə yüklənirsə, onRestart sadəcə ViewModel-də refresh() metodunu çağıra bilər, View isə reaktiv axın vasitəsilə yenilənmiş məlumatlara abunə olar.

Google tövsiyə edir: onCreate məntiqini onRestart-da təkrarlamayın. ViewModel-də cari məlumatları yükləyən refresh() metodları ayırın və onları onRestart-da çağırın. Bu, MVVM arxitekturasının təmizliyini qoruyur və kod təkrarlanmasını aradan qaldırır.

onRestart istifadə ssenariləri: məlumat və UI yeniləmə

onRestart — ekrana hər qayıdışda yerinə yetirilməli, lakin ilk açılışda lazım olmayan əməliyyatlar üçün ideal yerdir. Tipik ssenarilər:

  • DB və ya API-dən siyahının yenilənməsi — istifadəçi başqa Activity-yə keçdi, orada məlumatları dəyişdi, qayıtdı — siyahı aktual olmalıdır. onRestart-da viewModel.refreshItems() çağırın.
  • Avtorizasiya yoxlaması — Activity uzun müddət gizli qaldısa, giriş tokeni vaxtı keçmiş ola bilər. onRestart tokenin etibarlılığını yoxlamaq və giriş ekranına yönləndirmək üçün nöqtədir.
  • UI vəziyyətinin sinxronlaşdırılması — mövzu dəyişmə, dil dəyişikliyi, parametrlərin yenilənməsi — dəyişikliklər ekrana qayıtdıqda tətbiq olunmalıdır.
  • Multimedia yenidən yüklənməsi — Activity dəyişə bilən məzmun göstərirsə (xəbər lenti, valyuta məzənnəsi, hava durumu), onRestart-da məlumatları yeniləyin.
  • Şəbəkə bağlantısının yoxlanması — oflayn rejimdən qayıdarkən Activity şəbəkənin əlçatanlığını yoxlamalı və UI-ni dəyişməlidir.
  • Animasiyaların bərpası — onStop-da sərbəst buraxılmış animasiyaları onStart-dan əvvəl onRestart-da yenidən işə salın.

onRestart-da nə etməməli: View-ləri yenidən işə salmayın — onlar canlıdır, çünki Activity məhv edilməyib. LiveData-ya yenidən abunə olmayın — abunə onCreate-də canlıdır. Yeni fragmentlər yaratmayın — onlar artıq FragmentManager-dadır.

onRestart və process death: vacib istisna

Ən vacib istisna: onRestart sistem tərəfindən tətbiq prosesi öldürüldükdə çağırılmır. Bu, tərtibatçıların tez-tez qaçırdığı, vəziyyətin bərpası üçün onRestart-a güvənərək səhv etdiyi əsas məqamdır.

Process death zamanı:

  • Tətbiq fonda idi, Android yaddaşı boşaltmaq üçün prosesi öldürdü.
  • İstifadəçi qayıdır — sistem yeni proses işə salır.
  • Activity yenidən yaradılır: onCreate(Bundle) → onStart → onResume.
  • onRestart çağırılmır — sistem üçün bu yeni Activity instansiyasıdır.

Bundan necə qorunmaq olar: kritik vəziyyəti həmişə onSaveInstanceState(Bundle)-də saxlayın (onStop-dan əvvəl çağırılır) və ya ViewModel-də SavedStateHandle istifadə edin. onCreate-də savedInstanceState-i yoxlayın: əgər null deyilsə, vəziyyəti Bundle-dən bərpa edin, null-dırsa — təzə məlumatları yükləyin.

Google Android Vitals-ə görə, fonda uzun müddət qaldıqdan sonra Activity-yə qayıdışların təxminən 7%-i process death-dən sonra baş verir. Bu o deməkdir ki, onRestart çağırmalı olan hər 15-ci Activity əslində onCreate-dən keçir. Bu ssenarinin nəzərə alınmaması „qayıdışdan sonra boş ekran“ səhvinin əsas səbəblərindən biridir.

Kotlin-də onRestart ilə kod nümunələri

Nümunə 1: ViewModel vasitəsilə siyahı yeniləmə ilə onRestart

Activity redaktə ekranından qayıtdıqdan sonra tapşırıq siyahısını yeniləmək üçün onRestart-da viewModel.refreshTasks() çağırır.

kotlin
class TaskListActivity : AppCompatActivity() {
    private val viewModel: TaskViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_task_list)
        viewModel.tasks.observe(this) { tasks ->
            Log.d("TaskList", "${tasks.size} tapşırıq alındı")
        }
    }

    override fun onRestart() {
        super.onRestart()
        Log.d("TaskList", "onRestart: tapşırıq siyahısının yenilənməsi")
        viewModel.refreshTasks()
    }
}

class TaskViewModel : ViewModel() {
    private val _tasks = MutableLiveData<List<Task>>()
    val tasks: LiveData<List<Task>> get() = _tasks

    fun refreshTasks() {
        viewModelScope.launch {
            _tasks.value = TaskRepository().getAllTasks()
        }
    }
}

ViewModel.refreshTasks() repozitoriyadan cari məlumatları yükləyir. LiveData avtomatik olaraq Activity-ni məlumat dəyişikliyi barədə xəbərdar edir — UI əlavə kod olmadan yenilənir. OnRestart yeni abunə yaratmır — o, artıq onCreate-də qurulub.

Nümunə 2: Avtorizasiya yoxlaması ilə onRestart

Activity qayıdışda tokenin etibarlılığını yoxlayır və lazım olduqda giriş səhifəsinə yönləndirir.

kotlin
class ProfileActivity : AppCompatActivity() {
    private val authManager = AuthManager()
    private val launcher = registerForActivityResult(
        ActivityResultContracts.StartActivityForResult()
    ) { Log.d("Profile", "Giriş ekranından qayıdıldı") }

    override fun onRestart() {
        super.onRestart()
        if (!authManager.isTokenValid()) {
            Log.d("Profile", "Tokenin vaxtı keçdi — girişə yönləndirmə")
            launcher.launch(Intent(this, LoginActivity::class.java))
        }
    }
}

class AuthManager {
    fun isTokenValid(): Boolean {
        val expiry = SharedPreferencesManager().getTokenExpiry()
        return System.currentTimeMillis() < expiry
    }
}

Əgər istifadəçi tətbiqi uzun müddətə kiçildibsə və tokenin vaxtı keçdikdən sonra qayıdıbsa, onRestart onu giriş ekranına yönləndirəcək. Bu, vaxtı keçmiş tokenlə sorğu yerinə yetirməyə cəhd edərkən API səhvlərinin qarşısını alır. Diqqət: yoxlama onRestart-da, onResume-də deyil — dialoqdan qayıdışda lazımsız yoxlamanın qarşısını almaq üçün.

Nümunə 3: Fragment-də ViewLifecycleOwner ilə onRestart

Fragment məlumat yeniləməsi üçün LifecycleObserver vasitəsilə onRestart-dan istifadə edir.

kotlin
class FeedFragment : Fragment() {
    private val viewModel: FeedViewModel by viewModels()

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        viewLifecycleOwner.lifecycle.addObserver(object : LifecycleObserver {
            @OnLifecycleEvent(Lifecycle.Event.ON_RESTART)
            fun onRestart() {
                Log.d("FeedFragment", "onRestart LifecycleObserver vasitəsilə")
                viewModel.refreshFeed()
            }
        })
    }
}

Fragment-də onRestart-ı ləğv etmək əvəzinə LifecycleObserver istifadə olunur — bu, vərəsəlik olmadan həyat dövrü hadisələrinə məntiq əlavə etməyə imkan verən daha çevik yanaşmadır. ViewLifecycleOwner observer-in View skopunda yaşamasını təmin edir (onDestroyView-dən sonra yaşamır).

Tez-tez verilən suallar

onRestart onResume-dən nə ilə fərqlənir?

onResume Activity fokus aldıqda hər dəfə çağırılır — o cümlədən dialoq və ya sistem menyusundan qayıtdıqda (Activity onStop-a getməmişdir). onRestart yalnız Activity tam gizlədildikdə Stopped vəziyyətindən qayıtdıqda çağırılır. onRestart „ağır“ yeniləmələr üçün daha dar hadisədir, onResume isə yüngül əməliyyatlar üçündür (başlıq dəyişmə, vaxt yeniləmə).

onRestart onStop olmadan çağırıla bilərmi?

Xeyr, çağırıla bilməz. onRestart onStop ilə qoşalaşmış metoddur: onRestart yalnız Activity onStop-dan keçdikdən sonra çağırılır. Activity onStop-a getməyibsə (məsələn, dialoq pəncərəsi açıqdır), qayıdışda onRestart çağırılmır — yalnız onResume.

Emulyatorda onRestart-ı necə simulyasiya etmək olar?

Emulyatorda Home düyməsini sıxın — Activity kiçiləcək, onStop alacaq. Sonra tətbiqi Recent Apps və ya launcher vasitəsilə açın — Activity onRestart → onStart → onResume alacaq. Debug üçün Debug rejimindən onRestart-da dayanma nöqtələri ilə və ya Log.d Activity teqi ilə istifadə edin.

onRestart-da istisna atılsa nə olar?

onRestart-da tutulmayan istisna Force Close-a səbəb olacaq. Sistem həyat dövrü callback-lərində istisnaları tutmur. onRestart-da istisna ata biləcək əməliyyatlar yerinə yetirilirsə (try-catch olmadan şəbəkə sorğusu, null View ilə iş), onları try-catch ilə əhatə edin.

onRestart-da isFinishing() yoxlamaq lazımdırmı?

Xeyr. onRestart yalnız Stopped vəziyyətindən qayıdan canlı Activity-lər üçün çağırılır. isFinishing() onRestart-da həmişə false olacaq. isFinishing() yoxlamasının mənası onPause (məlumatların saxlanması) və onDestroy (yenidən yaratmanı finish()-dən fərqləndirmə) üçündür.

Xülasə

  • onRestart — Activity Stopped vəziyyətindən qayıtdıqda, onStart və onResume-dən əvvəl çağırılan həyat dövrü metodu.
  • onRestart Activity-nin ilk yaradılmasında çağırılmır — yalnız tam gizlənmədən sonra təkrar göstərilməsində.
  • onRestart-ın əsas təyinatı köhnəlmiş məlumatları yeniləmək və vəziyyəti yoxlamaqdır (token, şəbəkə, parametrlər).
  • onRestart process death zamanı çağırılmır — prosesin öldürülməsindən sonra bərpa üçün onCreate-i Bundle ilə istifadə edin.
  • onCreate məntiqini onRestart-da təkrarlamayın: işə salmanı onCreate-də, yeniləməni onRestart-da edin.
  • Fragment üçün onRestart-ı ləğv etmək əvəzinə viewLifecycleOwner-də LifecycleObserver istifadə edin.
  • onRestart-ın düzgün tətbiqi çoxtapşırıqlılıq zamanı UX-i yaxşılaşdırır və köhnəlmiş məlumatların göstərilməsinin qarşısını alır.

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