State Restoration, bir uygulamanın yeniden başlatılması veya simge durumuna küçültülmesinden sonra kullanıcı arayüzünü kaydetmeye ve geri yüklemeye olanak tanıyan bir mobil işletim sistemi mekanizmasıdır. Sistem, UI durumunu belleğe veya kalıcı depolama alanına kaydeder ve yeniden açıldığında geri yükler. Android Developers (2025)'a göre State Restoration, kaliteli bir kullanıcı deneyimi hedefleyen uygulamalar için zorunludur. State Restoration, bir uygulama beklenmedik şekilde sonlandığında veri kaybını önlemek için kritik öneme sahiptir.
Önemli Noktalar
State Restoration (durum geri yükleme), bir uygulamanın kullanıcı arayüzünün mevcut durumunu kaydetmeye ve sonlandırma veya yeniden başlatmadan sonra geri yüklemeye olanak tanıyan bir sistem mekanizmasıdır. Bir kullanıcı uygulamayı simge durumuna küçülttüğünde veya sistem kaynakları boşaltmak için uygulamayı kapattığında, State Restoration temel UI parametrelerini yakalar ve bunları şifrelenmiş depolama alanına kaydeder.
State Restoration olmadan, kullanıcılar uygulamalar arasında geçiş yaparken kaydedilmemiş tüm verileri kaybeder. Örneğin, doldurulmuş bir geri bildirim formu, uzun bir arama sorgusu veya kısmen görüntülenmiş bir haber listesi — tüm bunlar yeniden başlatmada kaybolur. State Restoration, simge durumuna küçültme anında ViewController veya Activity durumunu otomatik olarak yakalayarak bu sorunu çözer.
Mekanizma sistem düzeyinde çalışır ve her iki ana mobil platform tarafından da desteklenir. iOS, State Restoration'ı NSUserActivity ve UIStateRestoring protokolü aracılığıyla sağlarken, Android bunu Jetpack mimari bileşenlerindeki SavedStateHandle ve ViewModel aracılığıyla sağlar. Uygulama farklılık gösterir, ancak kavram aynıdır.
State Restoration süreci iki aşamaya ayrılır: kaydetme ve geri yükleme. Kaydetme aşamasında sistem, ilgili yaşam döngüsü yöntemlerini çağırır ve uygulamanın mevcut UI durumunu kompakt bir temsile serileştirmesi gerekir. Geri yükleme aşamasında sistem, kaydedilen verileri geri gönderir ve uygulama, UI'yı geri yüklemek için bunların serisini çözer.
Kaydetme, uygulama arka plana geçtiğinde veya yakın bir sonlandırma sinyali aldığında sistem tarafından başlatılır. iOS'ta UIViewController'ın encodeRestorableState yöntemi çağrılır; Android'de Activity'nin onSaveInstanceState'ı veya SavedStateHandle aracılığıyla kaydetme tetiklenir. Veriler, ilkel türleri destekleyen bir biçimde serileştirilir: dizeler, sayılar, bayt dizileri ve Parcelable nesneleri.
Kaydedilen veri miktarı minimum düzeyde olmalıdır — sistem, kaydedilmiş durum paketinin boyutuna sınırlamalar getirir. Android'de sınır, işlem başına yaklaşık 50 KB'dir. Sınırın aşılması, TransactionTooLargeException istisnasına neden olur. Bu nedenle mimarlar, yalnızca tanımlayıcıları ve anahtarları kaydetmeyi ve geri yükleme sırasında tam verileri kalıcı depolama alanından yüklemeyi önerir.
Geri yükleme sırasında sistem, başlatma anında kaydedilmiş veri paketini uygulamaya iletir. iOS'ta decodeRestorableState yöntemi çağrılır; Android'de onRestoreInstanceState veya SavedStateHandle'dan okuma kullanılır. Uygulama, paketten tanımlayıcıları ve anahtarları çıkarır ve UI'yı geri yükler: kaydırma konumu, seçilen öğeler, girilen veriler.
Geri yüklemenin yeni bir işlemde gerçekleşebileceğini unutmamak önemlidir. Uygulama bellekten tamamen boşaltılmışsa, işlem yeniden oluşturulur ve bellekteki tüm nesneler yoktur. Bu nedenle durum, serileştirilebilir olmalı ve önceki oturumun çalışma zamanı bağlamından bağımsız olmalıdır. Bu, özellikle birden çok giriş alanına sahip büyük formlar ve uzun çok sayfalı arayüzler için kritiktir.
class MainActivity : AppCompatActivity() {
private var searchQuery: String = ""
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putString("search_query", searchQuery)
}
override fun onRestoreInstanceState(savedState: Bundle) {
super.onRestoreInstanceState(savedState)
searchQuery = savedState.getString("search_query", "")!!
restoreSearchUI(searchQuery)
}
}
State Restoration uygulaması platformlar arasında önemli ölçüde farklılık gösterir. iOS, storyboard'lar ve UIKit protokolleri aracılığıyla bildirimsel bir yaklaşım kullanırken, Android, Activity yaşam döngüsü yöntemleri ve Jetpack mimari bileşenleri aracılığıyla zorunlu bir yaklaşım kullanır. Yaklaşım seçimi, hedef platforma ve uygulama mimarisine bağlıdır.
iOS'ta State Restoration üç bileşen üzerine kurulmuştur: UIApplication genel süreci yönetir, UIViewController UIStateRestoring protokolünü uygular ve NSUserActivity gezinme geri yüklemesi için veri depolar. Etkinleştirmek için UIViewController'da restorationIdentifier ayarlanmalı ve encodeRestorableState ile decodeRestorableState uygulanmalıdır.
iOS, restorationIdentifier ayarlanmışsa gezinme denetleyicisinin (UINavigationController) ve tüm iç içe ViewController'ların durumunu otomatik olarak kaydeder. Sistem, gezinme yığınını yönetir ve onu orijinal durumuna geri yükler. Ancak, denetleyicilerin içindeki veriler (girilen metin, kaydırma konumu) geliştirici tarafından açıkça kaydedilmelidir.
Android'de State Restoration'a modern yaklaşım SavedStateHandle — AndroidX Lifecycle kitaplığından bir bileşen — üzerine kurulmuştur. SavedStateHandle, ViewModel içinde erişilebilirdir ve yapılandırma değişikliklerinde (ekran döndürme) ve işlem yeniden başlatmada verileri otomatik olarak kaydeder ve geri yükler. Veriler bir Bundle'da depolanır ve otomatik olarak serileştirilir.
SavedStateHandle, LiveData desteğiyle bir anahtar-değer deposu gibi davranır. Yapılandırma değişikliklerinde veriler otomatik olarak kaydedilir ve geri yüklenir. İşlem yeniden başlatmayı desteklemek için ViewModel, SavedStateViewModelFactory aracılığıyla oluşturulmalıdır — bu, ViewModel'in uygulamanın tamamen sonlandırılmasından sonra da devam etmesini sağlar.
class SearchViewModel(
private val savedStateHandle: SavedStateHandle
) : ViewModel() {
companion object {
private val KEY_QUERY = string("search_query")
}
fun getSearchQuery(): String? = savedStateHandle[KEY_QUERY]
fun saveSearchQuery(query: String) {
savedStateHandle[KEY_QUERY] = query
}
}
State Restoration'ın pratik uygulaması, birkaç hususun dikkate alınmasını gerektirir: doğru depolama alanını seçme, kaydedilecek veri miktarını belirleme ve çeşitli sonlandırma senaryolarını test etme. Flutter uygulaması için state_restoration paketini kullanarak adım adım uygulamayı inceleyelim.
class RestorableSearchField extends RestorableProperty<String> {
String _value = '';
@override
String get value => _value;
@override
void set value(String newValue) {
if (_value != newValue) {
_value = newValue;
notifyListeners();
}
}
@override
String? toPrimitives() => _value;
@override
void fromPrimitives(String? data) {
_value = data ?? '';
}
}
Uygulama yaparken kaydetme sınırlarını hatırlamak önemlidir. Her UI alanının geri yüklenmesi gerekmez. Uzun bir listede kaydırma konumu — evet. Geçici bir animasyon durumu — hayır. Geliştirici, hangi verilerin kullanıcı deneyimi için kritik olduğunu ve hangilerinin rahatlık kaybı olmadan güvenle sıfırlanabileceğini bilinçli olarak seçmelidir.
State Restoration'ı test etmek, işlem sonlandırmayı simüle etmeyi gerektiren ayrı bir görevdir. Android'de bu, adb shell am kill komutuyla yapılabilir; iOS'ta Xcode'da sonlandırma simülasyonuyla yapılabilir. Espresso ve XCTest gibi UI test çerçeveleri, durum geri yüklemeyi doğrulamak için özel yöntemler sağlar.
Birinci kural — verileri değil, tanımlayıcıları kaydedin. Yüz alanlı tam nesneyi kaydetmek yerine, benzersiz tanımlayıcısını kaydedin ve geri yüklemede veritabanından veya API'den gerçek verileri yükleyin. Bu, Bundle'da yer tasarrufu sağlar ve geri yükleme anında verilerin güncelliğini garanti eder.
İkinci kural — tüm senaryoları test edin. Ekran döndürmeden sonra, simge durumuna küçültüp bir saat sonra geri döndükten sonra, sistemin bellek yetersizliği nedeniyle uygulamayı sonlandırmasından sonra geri yüklemeyi kontrol edin. Her senaryo, işletim sistemi durumuna ve mevcut kaynaklara bağlı olarak farklı davranabilir.
Üçüncü kural — özel değil, sistem mekanizmalarını kullanın. iOS ve Android, kendi platformları için optimize edilmiş State Restoration için yerleşik API'ler sağlar. SharedPreferences veya UserDefaults aracılığıyla özel uygulama, eşitleme sorunlarına ve geri yükleme sırasında beklenmeyen davranışlara yol açabilir.
Dördüncü kural — durum yokluğunu işleyin. İlk başlatmada veya verilerin temizlenmesinden sonra durum mevcut olmayabilir. UI, özel durumlar oluşturmadan başlangıç durumunda doğru şekilde çalışmalıdır. Kullanmadan önce tüm kaydedilmiş verileri null için kontrol edin ve varsayılan değerler sağlayın.
Beşinci kural — kaydedilmiş anahtarları belgeleyin. Bir projede düzinelerce ekran olduğunda ve her biri birden çok alan kaydettiğinde, merkezi anahtar yönetimi olmadan kaos oluşur. Her modülde State Restoration için anahtar sabitlerine sahip tek bir sınıf veya dosya oluşturun. Bu, bakımı basitleştirir ve yeniden düzenleme sırasında yanlışlıkla verilerin üzerine yazılmasını önler.
Sıkça Sorulan Sorular
State Restoration, uygulamanın yeniden başlatılması veya simge durumuna küçültülmesinden sonra kullanıcı arayüzünü kaydeden ve geri yükleyen, veri ve kullanıcı bağlamı kaybını önleyen bir mekanizmadır.
State Restoration geçici UI durumunu (kaydırma konumu, form verileri) kaydederken, veritabanı kalıcı kullanıcı verilerini depolar. State Restoration, hacim sınırlamaları olan sistem mekanizmalarını (Bundle, NSData) kullanır.
AndroidX Lifecycle'dan ViewModel'de SavedStateHandle kullanın. Simge durumuna küçültmede verileri otomatik olarak kaydeder ve geri dönüşte geri yükler. Tam yeniden başlatma desteği için SavedStateViewModelFactory kullanın.
UIViewController'da restorationIdentifier ayarlayın ve encodeRestorableState ile decodeRestorableState yöntemlerini uygulayın. Gezinme için, denetleyici yığınında yolu koruyarak NSUserActivity kullanın.
Tam verileri değil, tanımlayıcıları kaydedin: seçilen öğenin kimliği, arama sorgusu, kaydırma konumu, geçiş durumları. Büyük nesneleri ve görselleri kaydetmekten kaçının.
Ö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