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 — 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 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ı:
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, 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.
| Özellik | onRestart | onCreate |
|---|---|---|
| Ne zaman çağrılır | Activity Stopped'tan döner | Activity ilk kez oluşturulur veya yok edildikten sonra |
| Durum korunur | Evet — ViewModel ve alanlar canlı | Hayır — her şey yeniden oluşturulur |
| Bundle | İletilmez | İletilir (savedInstanceState) |
| Tipik eylemler | Veri güncelleme, UI yenileme | View başlatma, LiveData aboneliği |
| Çağrılma sıklığı | Her dönüşte | Bir 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, ekrana her dönüşte gerçekleştirilmesi gereken ancak ilk açılışta gerekmeyen işlemler için ideal yerdir. İşte tipik senaryolar:
viewModel.refreshItems() çağrısı yapın.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.
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:
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.
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.
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.
Activity, dönüşte token geçerliliğini kontrol eder ve gerekirse giriş sayfasına yönlendirir.
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.
Fragment, verileri güncellemek için LifecycleObserver aracılığıyla onRestart'ı kullanır.
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
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.
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 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 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.
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
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.
Ayrıca okuyun