onRestart — yaşam döngüsünde Activity'yi geri yükleme

Yazar: IT Sectr Yayınlanma: 2026-03-04 Okuma süresi: 8 dk

onRestart — Android'deki Activity yaşam döngüsünün bir yöntemi olup, sistem tarafından Activity Stopped durumundan Started durumuna dönmeden önce çağrılır. onRestart, daha önce başka bir ekran tarafından gizlenmiş veya arka plana küçültülmüş bir Activity'nin kullanıcı için yeniden görünür hale geldiğini bildirir. onRestart'ta geliştirici, güncel olmayan verileri günceller, listeleri yeniden yükler ve Activity görünmezken değişmiş olabilecek UI durumunu geri yükler. Google Android Vitals (2025)'e göre, onRestart'ı veri güncellemek için kullanan uygulamalar, ekrana döndüklerinde %25 daha az hatalı bilgi görüntüleme vakası gösterir. Android Developers Belgeleri, onRestart'ı Activity'nin ekranda yeniden görünmesinden önceki bir hazırlık adımı olarak tanımlar.

Önemli Noktalar

  • onRestart, bir Activity Stopped durumundan döndüğünde, onStart ve onResume'dan önce çağrılır.
  • onRestart, Activity ilk oluşturulduğunda çağrılmaz — yalnızca gizlendikten sonra yeniden gösterildiğinde çağrılır.
  • onRestart'ın ana amacı, Activity görünmezken değişmiş olabilecek verileri güncellemektir.
  • onRestart, süreç ölümü sırasında çağrılmaz — bu durumda Activity, onCreate aracılığıyla yeniden oluşturulur.
  • onRestart'ın doğru kullanımı, çoklu görev ve uygulamalar arasında geçiş sırasında kullanıcı deneyimini iyileştirir.

onRestart — Android yaşam döngüsünde yöntemin özü

onRestart — Android'in onStart'tan hemen önce, bir Activity görünmez Stopped durumundan görünür hale döndüğünde çağırdığı bir geri çağırma yöntemidir. Bu yöntem, yalnızca Activity yeniden gösterildiğinde çağrılması bakımından benzersizdir — örneğin ilk oluşturulması sırasında sıra onCreate ile başlar ve onRestart'ı atlar. Tam döngü: onCreate → onStart → onResume (ilk başlatma) veya onRestart → onStart → onResume (sonraki gösterim).

Android sistemi açısından onRestart, Activity'nin dönüşüne hazırlanmasını sağlayan bir optimizasyondur: depodan veri güncelleme, UI durumunu senkronize etme, ağ bağlantısını kontrol etme. Activity odağı her kazandığında çağrılan onResume'un (bir iletişim kutusundan veya sistem menüsünden dönüş dahil) aksine, onRestart yalnızca tam bir gizleme ve dönüş döngüsü sırasında tetiklenir. Bu, onRestart'ı kısmi odak kaybı sırasında gerekmeyen “ağır” güncelleme işlemleri için ideal yer haline getirir.

Android Activity yaşam döngüsü spesifikasyonuna göre, onStop ve onRestart arasındaki zaman aralığı birkaç saniye (kullanıcı hızlıca geçiş yaptı) ile birkaç saat (uygulama arka plandaydı ve kullanıcı geri döndü) arasında değişebilir. Bu süre zarfında, uzak bir kaynaktaki (API, DB) veriler değişmiş olabilir, bu nedenle onRestart güncelliği kontrol etmek için doğal bir noktadır.

onRestart ne zaman çağrılır: koşullar ve sıra

onRestart yalnızca bir Activity Stopped durumundan döndüğünde çağrılır, Activity onStop çağrıldıktan sonra bu duruma girmiştir. Aşağıda onRestart'a yol açan tüm senaryolar listelenmiştir.

onRestart çağrılma senaryoları:

  • Başka bir Activity'den dönüş — kullanıcı yeni bir Activity açtı (örneğin, bir bildirime dokundu) ve ardından geri gitti (“Geri” düğmesine bastı). Yığın: MainActivity.onPause → MainActivity.onStop → SecondActivity oluşturulur → kullanıcı “Geri” tuşuna basar → SecondActivity.onPause → SecondActivity.onStop → SecondActivity.onDestroy → MainActivity.onRestart → MainActivity.onStart → MainActivity.onResume.
  • Küçültmeden dönüş — kullanıcı uygulamayı küçülttü (Ana Ekran) ve bir süre sonra geri döndü. CurrentActivity.onPause → CurrentActivity.onStop → (uygulama arka planda) → kullanıcı döner → CurrentActivity.onRestart → CurrentActivity.onStart → CurrentActivity.onResume.
  • Kilit ekranından dönüş — kilit ekranı Activity'yi kaplar; kilit açıldıktan sonra, önemli bir süre geçmişse (5 saniyeden fazla) Activity onRestart alır.
  • Intent ile başlatılan bir uygulamadan dönüş — kamera, galeri, tarayıcı — startActivityForResult() veya ActivityResultLauncher ile başlatılan herhangi bir üçüncü taraf uygulaması.

onRestart NE ZAMAN çağrılmaz: ekran döndürme sırasında (Activity yok edilir ve onCreate aracılığıyla yeniden oluşturulur), bir iletişim kutusundan dönerken (Activity onStop'a girmez, yalnızca onPause → onResume), süreç ölümü sırasında (Activity yeniden oluşturulur).

onRestart ve onCreate: hangisi seçilmeli

onRestart ve onCreate, bir Activity'yi geri yüklemek için iki farklı yaklaşımdır. Aralarındaki seçim, Activity'nin tamamen yok edilip edilmediğine veya yalnızca gizlenip gizlenmediğine bağlıdır.

ÖzellikonRestartonCreate
Ne zaman çağrılırActivity Stopped'tan dönerActivity ilk kez oluşturulur veya yok edildikten sonra
Durum korunurEvet — ViewModel ve alanlar canlıHayır — her şey yeniden oluşturulur
Bundleİletilmezİletilir (savedInstanceState)
Tipik eylemlerVeri güncelleme, UI yenilemeView başlatma, LiveData aboneliği
Çağrılma sıklığıHer dönüşteBir kez veya yok edilmeden sonra

Seçim kuralı: View başlatma ve LiveData/StateFlow aboneliğini onCreate'te yapın (Fragment için onViewCreated'da). Veri güncellemeleri, liste yeniden yükleme ve durum kontrolleri — onRestart'ta. Veriler ViewModel aracılığıyla yükleniyorsa, onRestart ViewModel'deki refresh() yöntemini çağırabilir ve View, reaktif bir akış aracılığıyla güncellenen verilere abone olur.

Google şunları önerir: onRestart'ta onCreate mantığını kopyalamayın. ViewModel'de güncel verileri yükleyen refresh() yöntemlerini çıkarın ve bunları onRestart'ta çağırın. Bu, temiz bir MVVM mimarisini korur ve kod tekrarını ortadan kaldırır.

onRestart kullanım senaryoları: veri ve UI güncelleme

onRestart, ekrana her dönüşte gerçekleştirilmesi gereken ancak ilk açılışta gerekmeyen işlemler için ideal yerdir. İşte tipik senaryolar:

  • DB veya API'den listeyi güncelleme — kullanıcı başka bir Activity'ye gitti, orada verileri değiştirdi, geri döndü — liste güncel olmalıdır. onRestart'ta viewModel.refreshItems() çağrısı yapın.
  • Yetkilendirme kontrolü — Activity uzun süre gizli kaldıysa, erişim tokeninin süresi dolmuş olabilir. onRestart, token geçerliliğini kontrol etmek ve giriş ekranına yönlendirmek için noktadır.
  • UI durumu senkronizasyonu — tema değiştirme, dil değiştirme, ayar güncelleme — değişiklikler ekrana dönüşte uygulanmalıdır.
  • Medyayı yeniden yükleme — Activity değişmiş olabilecek içerik gösteriyorsa (haber akışı, döviz kurları, hava durumu), onRestart'ta verileri güncelleyin.
  • Ağ bağlantısı kontrolü — çevrimdışı moddan dönerken, Activity ağ kullanılabilirliğini kontrol etmeli ve UI'yi değiştirmelidir.
  • Animasyonları geri yükleme — onStop'ta serbest bırakılan animasyonlar, onStart'tan önce onRestart'ta yeniden başlatılmalıdır.

onRestart'ta YAPILMAMASI GEREKENLER: View'ları yeniden başlatmayın — Activity yok edilmediği için canlıdırlar. LiveData'ya yeniden abone olmayın — onCreate'teki abonelik hala canlıdır. Yeni Fragment'lar oluşturmayın — zaten FragmentManager'dadırlar.

onRestart ve süreç ölümü: önemli bir istisna

En önemli istisna: uygulama süreci sistem tarafından sonlandırılırsa onRestart çağrılmaz. Bu, geliştiricilerin durum geri yükleme için onRestart'a güvenirken sıklıkla gözden kaçırdığı önemli bir noktadır.

Süreç ölümü sırasında:

  • Uygulama arka plandaydı, Android belleği boşaltmak için süreci sonlandırdı.
  • Kullanıcı geri döner — sistem yeni bir süreç başlatır.
  • Activity yeniden oluşturulur: onCreate(Bundle) → onStart → onResume.
  • onRestart çağrılmaz — sistem için bu yeni bir Activity örneğidir.

Buna karşı nasıl korunulur: kritik durumu her zaman onSaveInstanceState(Bundle) içinde kaydedin (onStop'tan önce çağrılır) veya ViewModel'de SavedStateHandle kullanın. onCreate'te savedInstanceState'ı kontrol edin: null değilse, Bundle'dan durumu geri yükleyin; null ise, yeni veri yükleyin.

Google Android Vitals'a göre, arka planda uzun süre kaldıktan sonra Activity'ye dönüşlerin yaklaşık %7'si süreç ölümünden sonra gerçekleşir. Bu, onRestart'ı çağırması gereken her 15. Activity'nin aslında onCreate'ten geçtiği anlamına gelir. Bu senaryoyu göz ardı etmek, “dönüşten sonra boş ekran” hatalarının ana nedenlerinden biridir.

Kotlin'de onRestart ile kod örnekleri

Örnek 1: ViewModel aracılığıyla liste güncelleme ile onRestart

Activity, düzenleme ekranından döndükten sonra görev listesini güncellemek için onRestart'ta viewModel.refreshTasks() işlevini ç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} görev alındı")
        }
    }

    override fun onRestart() {
        super.onRestart()
        Log.d("TaskList", "onRestart: görev listesi güncelleniyor")
        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() deposundan güncel verileri yükler. LiveData, Activity'yi veri değişiklikleri hakkında otomatik olarak bilgilendirir — UI ek kod olmadan güncellenir. onRestart yeni bir abonelik oluşturmaz — zaten onCreate'te kurulmuştur.

Örnek 2: Yetkilendirme kontrolü ile onRestart

Activity, dönüşte token geçerliliğini kontrol eder ve gerekirse giriş sayfasına yönlendirir.

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

    override fun onRestart() {
        super.onRestart()
        if (!authManager.isTokenValid()) {
            Log.d("Profile", "Token süresi doldu — girişe yönlendiriliyor")
            launcher.launch(Intent(this, LoginActivity::class.java))
        }
    }
}

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

Kullanıcı uygulamayı uzun süre küçülttüyse ve token süresi dolduktan sonra geri döndüyse, onRestart onları giriş ekranına yönlendirecektir. Bu, süresi dolmuş bir token ile istek yapmaya çalışırken API hatalarını önler. Not: kontrol onRestart'tadır, onResume'da değil, bir iletişim kutusundan dönerken gereksiz kontrolden kaçınmak için.

Örnek 3: ViewLifecycleOwner ile Fragment'te onRestart

Fragment, verileri güncellemek için LifecycleObserver aracılığıyla onRestart'ı kullanır.

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", "LifecycleObserver ile onRestart")
                viewModel.refreshFeed()
            }
        })
    }
}

Fragment'te onRestart'ı geçersiz kılmak yerine, LifecycleObserver kullanılır — kalıtım olmadan yaşam döngüsü olay mantığı eklemeye izin veren daha esnek bir yaklaşım. ViewLifecycleOwner, observer'ın View kapsamında yaşamasını sağlar (onDestroyView'dan daha uzun yaşamaz).

Sıkça Sorulan Sorular

onRestart, onResume'dan nasıl farklıdır?

onResume, Activity odağı her kazandığında çağrılır — bir iletişim kutusundan veya sistem menüsünden dönüş dahil (Activity onStop'a girmedi). onRestart yalnızca Stopped durumundan dönerken, Activity tamamen gizliyken çağrılır. onRestart “ağır” güncellemeler için daha dar bir olaydır, onResume ise hafif işlemler (başlık değiştirme, saat güncelleme) içindir.

onRestart onStop olmadan çağrılabilir mi?

Hayır, çağrılamaz. onRestart, onStop ile eşleştirilmiş bir yöntemdir: onRestart yalnızca Activity onStop'tan geçtikten sonra çağrılır. Activity onStop'a girmediyse (örneğin, bir iletişim kutusu açıldıysa), dönüşte onRestart çağrılmaz — yalnızca onResume çağrılır.

Öykünücüde onRestart nasıl simüle edilir?

Öykünücüde Home (ana sayfa düğmesi) tuşuna basın — Activity küçültülecek ve onStop alacaktır. Ardından uygulamayı Son Uygulamalar veya başlatıcı aracılığıyla açın — Activity onRestart → onStart → onResume alacaktır. Hata ayıklama için, onRestart'ta kesme noktaları olan Debug veya Activity etiketiyle Log.d kullanın.

onRestart'ta bir istisna fırlatılırsa ne olur?

onRestart'ta yakalanmayan bir istisna Force Close'a neden olur. Sistem, yaşam döngüsü geri çağırmalarındaki istisnaları yakalamaz. onRestart'ta istisna fırlatabilecek işlemler (try-catch olmadan ağ isteği, null View ile çalışma) yapılıyorsa, bunları try-catch ile sarın.

onRestart'ta isFinishing() kontrol etmeli miyim?

Hayır. onRestart yalnızca Stopped durumundan dönen canlı Activity'ler için çağrılır. onRestart'ta isFinishing() her zaman false olacaktır. isFinishing() kontrolü onPause (veri kaydetme) ve onDestroy'de (yeniden oluşturmayı sonlandırmadan ayırt etme) anlamlıdır.

Özet

  • onRestart — bir Activity Stopped durumundan döndüğünde, onStart ve onResume'dan önce çağrılan bir yaşam döngüsü yöntemidir.
  • onRestart, Activity ilk oluşturulduğunda çağrılmaz — yalnızca tamamen gizlendikten sonra yeniden gösterildiğinde çağrılır.
  • onRestart'ın ana amacı, güncel olmayan verileri güncellemek ve durumu (token, ağ, ayarlar) kontrol etmektir.
  • onRestart, süreç ölümü sırasında çağrılmaz — süreç ölümünden sonra geri yükleme için Bundle ile onCreate kullanın.
  • onRestart'ta onCreate mantığını kopyalamayın: başlatmayı onCreate'te, güncellemeleri onRestart'ta yapın.
  • Fragment için, onRestart'ı geçersiz kılmak yerine viewLifecycleOwner'da LifecycleObserver kullanın.
  • onRestart'ın doğru uygulanması, çoklu görev sırasında UX'i iyileştirir ve güncel olmayan verilerin görüntülenmesini önler.

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun