Vəziyyətin bərpası (State Restoration) mobil əməliyyat sistemlərinin mexanizmidir və tətbiqin yenidən işə salınması və ya kiçildilməsindən sonra istifadəçi interfeysini qorumağa və bərpa etməyə imkan verir. Sistem UI vəziyyətini yaddaşda və ya daimi yaddaşda saxlayır və yenidən açıldıqda onu bərpa edir. Android Developers (2025) məlumatlarına görə, State Restoration keyfiyyətli istifadəçi təcrübəsi iddiasında olan tətbiqlər üçün məcburidir. State Restoration tətbiqin gözlənilməz bağlanması zamanı məlumat itkisinin qarşısını almaq üçün kritik əhəmiyyət daşıyır.
Əsas məqamlar
State Restoration (vəziyyətin bərpası) — tətbiqin cari istifadəçi interfeysi vəziyyətini qorumağa və onu bağlandıqdan və ya yenidən işə salındıqdan sonra bərpa etməyə imkan verən sistem mexanizmidir. İstifadəçi tətbiqi kiçiltdikdə və ya sistem resursları boşaltmaq üçün onu bağladıqda, State Restoration UI-nin əsas parametrlərini qeyd edir və onları şifrələnmiş yaddaşda saxlayır.
State Restoration olmadan istifadəçi tətbiqlər arasında keçid edərkən bütün yadda saxlanılmamış məlumatları itirir. Məsələn, doldurulmuş əlaqə forması, uzun axtarış sorğusu və ya qismən baxılmış xəbərlər siyahısı — bütün bunlar yenidən işə salındıqda yox olur. State Restoration bu problemi həll edir, avtomatik olaraq kiçiltmə anında ViewController və ya Activity-nin vəziyyətini qeydə alır.
Mexanizm sistem səviyyəsində işləyir və hər iki əsas mobil platforma tərəfindən dəstəklənir. iOS State Restoration-u NSUserActivity və UIStateRestoring protokolu vasitəsilə, Android isə Jetpack arxitektura komponentlərində SavedStateHandle və ViewModel vasitəsilə təmin edir. İmplementasiya fərqlənir, lakin konsepsiya eynidir.
State Restoration prosesi iki mərhələyə bölünür: saxlama (save) və bərpa (restore). Saxlama mərhələsində sistem həyat dövrünün müvafiq metodlarını çağırır, burada tətbiq cari UI vəziyyətini yığcam təsvirə serializasiya etməlidir. Bərpa mərhələsində sistem saxlanmış məlumatları geri ötürür və tətbiq UI-ni bərpa etmək üçün onları deserializasiya edir.
Saxlama sistem tərəfindən tətbiq fon rejiminə keçdikdə və ya yaxınlaşan bağlanma siqnalı aldıqda başladılır. iOS-da UIViewController-da encodeRestorableState metodu, Android-də isə Activity-də onSaveInstanceState və ya SavedStateHandle vasitəsilə saxlama çağrılır. Məlumatlar primitiv tipləri dəstəkləyən formata serializasiya olunur: sətirlər, ədədlər, bayt massivləri və Parcelable obyektləri.
Saxlanılan məlumatların həcmi minimal olmalıdır — sistem saxlanılan paketin ölçüsünə məhdudiyyət qoyur. Android-də limit bir proses üçün təxminən 50 KB təşkil edir. Limitin aşılması TransactionTooLargeException istisnasına səbəb olur. Buna görə də arxitektorlar yalnız identifikatorları və açarları saxlamağı, tam məlumatları isə bərpa zamanı daimi yaddaşdan yükləməyi tövsiyə edir.
Bərpa zamanı sistem saxlanmış məlumat paketini tətbiqə işə salınma anında ötürür. iOS-da decodeRestorableState metodu, Android-də isə onRestoreInstanceState və ya SavedStateHandle-dən oxuma çağrılır. Tətbiq paketdən identifikatorları və açarları çıxarır və UI-ni bərpa edir: sürüşdürmə mövqeyi, seçilmiş elementlər, daxil edilmiş məlumatlar.
Nəzərə almaq vacibdir ki, bərpa yeni prosesdə baş verə bilər. Tətbiq tamamilə yaddaşdan boşaldılıbsa, proses yenidən yaradılır və yaddaşdakı bütün obyektlər mövcud olmur. Buna görə də vəziyyət serializasiya oluna bilən və əvvəlki sessiyanın iş vaxtı kontekstindən asılı olmayan olmalıdır. Bu, xüsusilə çoxsaylı giriş sahələri olan böyük formalar və uzun çoxsəhifəli interfeyslər üçün kritikdir.
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-un implementasiyası platformalar arasında əhəmiyyətli dərəcədə fərqlənir. iOS storyboard və UIKit protokolları vasitəsilə deklarativ yanaşmadan, Android isə Activity-nin həyat dövrü metodları və Jetpack arxitektura komponentləri vasitəsilə imperativ yanaşmadan istifadə edir. Yanaşmanın seçimi hədəf platformadan və tətbiqin arxitekturasından asılıdır.
iOS-da State Restoration üç komponentə əsaslanır: UIApplication ümumi prosesi idarə edir, UIViewController UIStateRestoring protokolunu implementasiya edir, NSUserActivity isə naviqasiyanın bərpası üçün məlumatları saxlayır. Aktivləşdirmək üçün UIViewController-da restorationIdentifier təyin etmək və encodeRestorableState ilə decodeRestorableState metodlarını implementasiya etmək lazımdır.
iOS naviqasiya kontrollerinin (UINavigationController) və bütün daxili ViewController-ların vəziyyətini avtomatik saxlayır, əgər onlarda restorationIdentifier təyin edilibsə. Sistem naviqasiya yığınını idarə edir və onu orijinal vəziyyətdə bərpa edir. Lakin kontrollerlər daxilindəki məlumatlar (daxil edilmiş mətn, sürüşdürmə mövqeyi) tərtibatçı tərəfindən açıq şəkildə saxlanmalıdır.
Android-də State Restoration-a müasir yanaşma AndroidX Lifecycle kitabxanasından SavedStateHandle komponentinə əsaslanır. SavedStateHandle ViewModel daxilində mövcuddur və konfiqurasiya dəyişikliyi (ekranın döndərilməsi) və prosesin yenidən işə salınması zamanı məlumatları avtomatik saxlayır və bərpa edir. Məlumatlar Bundle-da saxlanılır və avtomatik serializasiya olunur.
SavedStateHandle LiveData dəstəyi ilə açar-dəyər anbarı kimi davranır. Konfiqurasiya dəyişikliyi zamanı məlumatlar avtomatik saxlanılır və bərpa olunur. Prosesin yenidən işə salınmasını dəstəkləmək üçün ViewModel SavedStateViewModelFactory vasitəsilə yaradılmalıdır — bu, ViewModel-ə tətbiqin tam bağlanmasından sağ çıxmağa imkan verir.
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-un praktik implementasiyası bir neçə aspekti nəzərə almağı tələb edir: düzgün yaddaşın seçilməsi, saxlanılan məlumatların həcminin müəyyən edilməsi və müxtəlif bağlanma ssenarilərinin test edilməsi. Flutter tətbiqi üçün state_restoration paketindən istifadə edərək addım-addım implementasiyanı nəzərdən keçirək.
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 ?? '';
}
}
İmplementasiya zamanı saxlama sərhədlərini xatırlamaq vacibdir. Hər UI sahəsi bərpa tələb etmir. Uzun siyahıda sürüşdürmə mövqeyi — bəli. Animasiyanın müvəqqəti vəziyyəti — yox. Tərtibatçı şüurlu şəkildə hansı məlumatların istifadəçi təcrübəsi üçün kritik olduğunu, hansıların isə rahatlığı itirmədən təhlükəsiz sıfırlana biləcəyini seçməlidir.
State Restoration-un test edilməsi prosesin bağlanmasının simulyasiyasını tələb edən ayrıca bir vəzifədir. Android-də bu, adb shell am kill əmri ilə, iOS-da isə Xcode-da bağlanmanın simulyasiyası ilə edilə bilər. Espresso və XCTest kimi UI test çərçivələri vəziyyətin bərpasını yoxlamaq üçün xüsusi metodlar təqdim edir.
Birinci qayda — identifikatorları, məlumatları deyil saxlayın. Yüz sahəsi olan tam obyekti saxlamaq əvəzinə, onun unikal identifikatorunu saxlayın və bərpa zamanı verilənlər bazasından və ya API-dən aktual məlumatları yükləyin. Bu, Bundle-da yerə qənaət edir və bərpa anında məlumatların aktuallığını təmin edir.
İkinci qayda — bütün ssenariləri test edin. Ekranın döndərilməsindən sonra, kiçiltmə və bir saat sonra qayıtdıqdan sonra, yaddaş çatışmazlığı səbəbindən sistem tərəfindən tətbiqin bağlanmasından sonra bərpanı yoxlayın. Hər ssenari əməliyyat sisteminin vəziyyətindən və mövcud resurslardan asılı olaraq fərqli davrana bilər.
Üçüncü qayda — sistem mexanizmlərindən istifadə edin, öz mexanizmlərinizdən yox. iOS və Android State Restoration üçün müvafiq platformaya optimallaşdırılmış daxili API-lər təqdim edir. SharedPreferences və ya UserDefaults vasitəsilə öz implementasiya sinxronizasiya problemlərinə və bərpa zamanı gözlənilməz davranışa səbəb ola bilər.
Dördüncü qayda — vəziyyətin olmamasını idarə edin. İlk işə salınma və ya məlumatların təmizlənməsindən sonra vəziyyət mövcud olmaya bilər. UI ilkin vəziyyətdə istisnalar atmadan düzgün işləməlidir. İstifadədən əvvəl bütün saxlanmış məlumatları null üçün yoxlayın və standart dəyərləri təmin edin.
Beşinci qayda — saxlanılan açarları sənədləşdirin. Layihədə onlarla ekran olduqda və hər biri bir neçə sahə saxladıqda, mərkəzləşdirilmiş açar idarəçiliyi olmadan xaos yaranır. Hər modulda State Restoration üçün açarların sabitləri ilə vahid sinif və ya fayl yaradın. Bu, dəstəyi asanlaşdırır və refaktorinq zamanı təsadüfi məlumatların üzərinə yazılmasının qarşısını alır.
Tez-tez verilən suallar
State Restoration — tətbiqin yenidən işə salınması və ya kiçildilməsindən sonra istifadəçi interfeysinin saxlanması və bərpası mexanizmi, istifadəçi məlumatlarının və iş kontekstinin itkisinin qarşısını alır.
State Restoration UI-nin müvəqqəti vəziyyətini (sürüşdürmə mövqeyi, formaya daxil edilmiş məlumatlar) saxlayır, verilənlər bazası isə daimi istifadəçi məlumatlarını saxlayır. State Restoration həcm məhdudiyyəti olan sistem mexanizmlərindən (Bundle, NSData) istifadə edir.
AndroidX Lifecycle-dən ViewModel-də SavedStateHandle istifadə edin. O, kiçiltmə zamanı məlumatları avtomatik saxlayır və qayıtdıqda bərpa edir. Tam yenidən işə salmağı dəstəkləmək üçün SavedStateViewModelFactory istifadə edin.
UIViewController-da restorationIdentifier təyin edin və encodeRestorableState ilə decodeRestorableState metodlarını implementasiya edin. Naviqasiya üçün kontrollerlər yığınında yolu saxlamaqla NSUserActivity istifadə edin.
Tam məlumatları deyil, identifikatorları saxlayın: seçilmiş elementin ID-si, axtarış sorğusu, sürüşdürmə mövqeyi, keçidlərin vəziyyəti. Böyük obyektlərin və şəkillərin saxlanmasından çəkinin.
Nəticə
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.
Həm də oxuyun