Az állapot-visszaállítás (State Restoration) a mobilos operációs rendszerek mechanizmusa, amely lehetővé teszi az alkalmazás felhasználói felületének mentését és visszaállítását az újraindítás vagy minimalizálás után. A rendszer elmenti az UI állapotát a memóriába vagy tartós tárolóba, és visszaállítja azt újbóli megnyitáskor. A Android Developers (2025) adatai szerint a State Restoration kötelező a minőségi felhasználói élményre törekvő alkalmazások számára. State Restoration kritikus fontosságú az adatvesztés megelőzésében az alkalmazás váratlan bezárásakor.
Főbb pontok
State Restoration (állapot-visszaállítás) egy rendszerszintű mechanizmus, amely lehetővé teszi az alkalmazás aktuális felhasználói felületi állapotának mentését és visszaállítását a bezárás vagy újraindítás után. Amikor a felhasználó minimalizálja az alkalmazást vagy a rendszer bezárja azt az erőforrások felszabadítása érdekében, a State Restoration rögzíti az UI kulcsfontosságú paramétereit, és elmenti azokat egy titkosított tárolóba.
State Restoration nélkül a felhasználó elveszíti az összes nem mentett adatot az alkalmazások közötti váltáskor. Például egy kitöltött kapcsolatfelvételi űrlap, egy hosszú keresési lekérdezés vagy egy részben megtekintett hírlista — mindez eltűnik az újraindításkor. A State Restoration megoldja ezt a problémát azáltal, hogy automatikusan rögzíti a ViewController vagy Activity állapotát a minimalizálás pillanatában.
A mechanizmus rendszerszinten működik, és mindkét fő mobilos platform támogatja. iOS a State Restoration-t az NSUserActivity-n és az UIStateRestoring protokollon keresztül biztosítja, az Android pedig a Jetpack architekturális komponensek SavedStateHandle-jén és ViewModel-jén keresztül. Az implementáció eltér, de a koncepció azonos.
A State Restoration folyamata két fázisra oszlik: mentés (save) és visszaállítás (restore). A mentési fázisban a rendszer meghívja az életciklus megfelelő metódusait, amelyekben az alkalmazásnak szerializálnia kell az aktuális UI állapotot egy tömör reprezentációvá. A visszaállítási fázisban a rendszer visszaadja a mentett adatokat, és az alkalmazás deszerializálja azokat az UI visszaállításához.
A mentést a rendszer indítja el, amikor az alkalmazás háttér módba lép, vagy amikor egy közelgő bezárásról szóló jelet kap. iOS-ben a encodeRestorableState metódus hívódik meg az UIViewController-ben, Androidban az onSaveInstanceState az Activity-ben vagy a mentés a SavedStateHandle-en keresztül. Az adatok primitív típusokat támogató formátumba szerializálódnak: karakterláncok, számok, bájttömbök és Parcelable objektumok.
A mentett adatok mennyiségének minimálisnak kell lennie — a rendszer korlátozásokat ír elő a mentett csomag méretére vonatkozóan. Androidban a határ körülbelül 50 KB folyamatonként. A határ túllépése TransactionTooLargeException kivételhez vezet. Ezért az építészek csak azonosítók és kulcsok mentését javasolják, a teljes adatokat pedig a visszaállításkor a tartós tárolóból kell betölteni.
A visszaállításkor a rendszer átadja a mentett adatcsomagot az alkalmazásnak az indítás pillanatában. iOS-ben a decodeRestorableState metódus hívódik meg, Androidban az onRestoreInstanceState vagy a SavedStateHandle-ből való olvasás. Az alkalmazás kinyeri az azonosítókat és kulcsokat a csomagból, és visszaállítja az UI-t: görgetési pozíció, kiválasztott elemek, bevitt adatok.
Fontos figyelembe venni, hogy a visszaállítás egy új folyamatban történhet. Ha az alkalmazás teljesen kikerült a memóriából, a folyamat újrateremtődik, és a memóriában lévő összes objektum hiányzik. Ezért az állapotnak szerializálhatónak és az előző munkamenet futásidejű kontextusától függetlennek kell lennie. Ez különösen kritikus a több beviteli mezővel rendelkező nagy űrlapok és a hosszú, többoldalas felületek esetében.
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)
}
}
A State Restoration implementációja jelentősen eltér a platformok között. iOS deklaratív megközelítést használ a storyboard és UIKit protokollok révén, míg Android imperatív megközelítést az Activity életciklus metódusain és a Jetpack architekturális komponenseken keresztül. A megközelítés kiválasztása a célplatformtól és az alkalmazás architektúrájától függ.
iOS-ben a State Restoration három komponensre épül: UIApplication kezeli a teljes folyamatot, UIViewController implementálja az UIStateRestoring protokollt, és NSUserActivity tárolja az adatokat a navigáció visszaállításához. Az aktiváláshoz be kell állítani a restorationIdentifier-t az UIViewController-ben, és implementálni kell az encodeRestorableState és decodeRestorableState metódusokat.
Az iOS automatikusan elmenti a navigációs vezérlő (UINavigationController) és az összes beágyazott ViewController állapotát, ha azok rendelkeznek beállított restorationIdentifier-rel. A rendszer kezeli a navigációs vermet, és visszaállítja azt az eredeti állapotba. Azonban a vezérlőkön belüli adatokat (bevitt szöveg, görgetési pozíció) a fejlesztőnek kifejezetten el kell mentenie.
Androidban a State Restoration modern megközelítése a SavedStateHandle-re épül — amely az AndroidX Lifecycle könyvtár egyik komponense. A SavedStateHandle a ViewModel-en belül érhető el, és automatikusan menti és visszaállítja az adatokat konfigurációváltozáskor (képernyőelforgatás) és a folyamat újraindításakor. Az adatok a Bundle-ben tárolódnak és automatikusan szerializálódnak.
A SavedStateHandle kulcs-érték tárolóként viselkedik LiveData támogatással. Konfigurációváltozáskor az adatok automatikusan mentődnek és visszaállítódnak. A folyamat újraindításának támogatásához a ViewModel-t a SavedStateViewModelFactory-n keresztül kell létrehozni — ez lehetővé teszi a ViewModel számára, hogy túlélje az alkalmazás teljes bezárását.
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
}
}
A State Restoration gyakorlati implementációja több szempont figyelembevételét igényli: a megfelelő tároló kiválasztása, a mentett adatok mennyiségének meghatározása és a különböző bezárási forgatókönyvek tesztelése. Tekintsük át a lépésről lépésre történő implementációt egy Flutter-alkalmazáshoz a state_restoration csomag használatával.
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 ?? '';
}
}
Az implementáció során fontos emlékezni a mentési határokra. Nem minden UI mezőt kell visszaállítani. Görgetési pozíció egy hosszú listában — igen. Az animáció átmeneti állapota — nem. A fejlesztőnek tudatosan kell kiválasztania, hogy mely adatok kritikusak a felhasználói élmény szempontjából, és melyek állíthatók vissza biztonságosan a kényelem elvesztése nélkül.
A State Restoration tesztelése külön feladat, amely a folyamat bezárásának szimulálását igényli. Androidon ez az adb shell am kill paranccsal, iOS-en a bezárás Xcode-beli szimulációjával végezhető el. Az UI-tesztelő keretrendszerek, mint az Espresso és az XCTest, speciális metódusokat biztosítanak az állapot-visszaállítás ellenőrzéséhez.
Első szabály — azonosítókat mentsen, ne adatokat. Ahelyett, hogy egy teljes objektumot mentene el száz mezővel, mentse el annak egyedi azonosítóját, és a visszaállításkor töltse be a friss adatokat az adatbázisból vagy API-ból. Ez helyet takarít meg a Bundle-ben, és garantálja az adatok frissességét a visszaállítás pillanatában.
Második szabály — teszteljen minden forgatókönyvet. Ellenőrizze a visszaállítást képernyőelforgatás után, minimalizálás és egy óra múlva történő visszatérés után, az alkalmazás memóriahiány miatti rendszer általi bezárása után. Minden forgatókönyv eltérően viselkedhet az operációs rendszer állapotától és a rendelkezésre álló erőforrásoktól függően.
Harmadik szabály — használja a rendszermechanizmusokat, ne a sajátjait. Az iOS és Android beépített API-kat biztosítanak a State Restoration számára, amelyek az adott platformra vannak optimalizálva. A saját implementáció SharedPreferences vagy UserDefaults segítségével szinkronizációs problémákhoz és váratlan viselkedéshez vezethet a visszaállításkor.
Negyedik szabály — kezelje az állapot hiányát. Az első indításkor vagy az adatok törlése után az állapot hiányozhat. Az UI-nak helyesen kell működnie a kezdeti állapotban anélkül, hogy kivételeket dobna. Ellenőrizze az összes mentett adatot null értékre használat előtt, és biztosítson alapértelmezett értékeket.
Ötödik szabály — dokumentálja a mentett kulcsokat. Amikor egy projektben tucatnyi képernyő van, és mindegyik több mezőt ment, központosított kulcskezelés nélkül káosz alakul ki. Hozzon létre egy egységes osztályt vagy fájlt a State Restoration kulcsállandóival minden modulban. Ez leegyszerűsíti a karbantartást, és megakadályozza az adatok véletlen felülírását refaktoráláskor.
Gyakran Ismételt Kérdések
State Restoration — az alkalmazás felhasználói felületének mentésére és visszaállítására szolgáló mechanizmus újraindítás vagy minimalizálás után, megakadályozva a felhasználói adatok és munkakontextus elvesztését.
A State Restoration az UI átmeneti állapotát menti el (görgetési pozíció, űrlapba bevitt adatok), míg az adatbázis a felhasználó állandó adatait tárolja. A State Restoration rendszermechanizmusokat (Bundle, NSData) használ mennyiségi korlátozással.
Használja a SavedStateHandle-t a ViewModel-ben az AndroidX Lifecycle-ből. Automatikusan menti az adatokat minimalizáláskor, és visszaállítja azokat visszatéréskor. A teljes újraindítás támogatásához használja a SavedStateViewModelFactory-t.
Állítsa be a restorationIdentifier-t az UIViewController-ben, és implementálja az encodeRestorableState és decodeRestorableState metódusokat. Navigációhoz használja az NSUserActivity-t a vezérlőverem elérési útjának mentésével.
Azonosítókat mentsen, ne teljes adatokat: a kiválasztott elem ID-ját, keresési lekérdezést, görgetési pozíciót, kapcsolók állapotát. Kerülje a nagy objektumok és képek mentését.
Összefoglalás
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is