Holatni tiklash (State Restoration) mobil operatsion tizimlarning mexanizmi bo'lib, ilova qayta ishga tushirilganda yoki kichraytirilgandan so'ng foydalanuvchi interfeysini saqlash va tiklash imkonini beradi. Tizim UI holatini xotirada yoki doimiy saqlashda saqlaydi va qayta ochilganda uni tiklaydi. Android Developers (2025) ma'lumotlariga ko'ra, State Restoration sifatli foydalanuvchi tajribasiga da'vogar ilovalar uchun majburiydir. State Restoration ilovaning kutilmagan yopilishida ma'lumotlarni yo'qotishning oldini olish uchun juda muhimdir.
Asosiy fikrlar
State Restoration (holatni tiklash) — ilovaning joriy foydalanuvchi interfeysi holatini saqlash va uni yopish yoki qayta ishga tushirishdan keyin tiklash imkonini beruvchi tizim mexanizmi. Foydalanuvchi ilovani kichraytirganda yoki tizim resurslarni bo'shatish uchun uni yopganda, State Restoration UI-ning asosiy parametrlarini qayd etadi va ularni shifrlangan saqlashda saqlaydi.
State Restoration bo'lmasa, foydalanuvchi ilovalar o'rtasida almashishda barcha saqlanmagan ma'lumotlarni yo'qotadi. Masalan, to'ldirilgan aloqa formasi, uzun qidiruv so'rovi yoki qisman ko'rilgan yangiliklar ro'yxati — bularning barchasi qayta ishga tushirilganda yo'qoladi. State Restoration bu muammoni hal qiladi, kichraytirish paytida ViewController yoki Activity holatini avtomatik ravishda qayd etadi.
Mexanizm tizim darajasida ishlaydi va ikkala asosiy mobil platforma tomonidan qo'llab-quvvatlanadi. iOS State Restoration-ni NSUserActivity va UIStateRestoring protokoli orqali, Android esa Jetpack arxitektura komponentlarida SavedStateHandle va ViewModel orqali ta'minlaydi. Amalga oshirish farqlanadi, ammo kontseptsiya bir xil.
State Restoration jarayoni ikki fazaga bo'linadi: saqlash (save) va tiklash (restore). Saqlash fazasida tizim hayotiy tsiklning tegishli metodlarini chaqiradi, bunda ilova joriy UI holatini ixcham tasvirga serializatsiya qilishi kerak. Tiklash fazasida tizim saqlangan ma'lumotlarni qaytaradi va ilova UI-ni tiklash uchun ularni deserializatsiya qiladi.
Saqlash tizim tomonidan ilova fon rejimiga o'tganda yoki yaqinlashib kelayotgan yopish signalini olganda boshlanadi. iOS-da UIViewController-da encodeRestorableState metodi, Android-da esa Activity-da onSaveInstanceState yoki SavedStateHandle orqali saqlash chaqiriladi. Ma'lumotlar primitiv turlarni qo'llab-quvvatlovchi formatga serializatsiya qilinadi: satrlar, raqamlar, bayt massivlari va Parcelable obyektlari.
Saqlangan ma'lumotlar hajmi minimal bo'lishi kerak — tizim saqlanadigan paket hajmiga cheklovlar qo'yadi. Android-da limit bir jarayon uchun taxminan 50 KB ni tashkil qiladi. Limitdan oshib ketish TransactionTooLargeException istisnosiga olib keladi. Shuning uchun arxitektorlar faqat identifikatorlar va kalitlarni saqlashni, to'liq ma'lumotlarni esa tiklash vaqtida doimiy saqlashdan yuklashni tavsiya qiladi.
Tiklash vaqtida tizim saqlangan ma'lumotlar paketini ilovaga ishga tushirish paytida uzatadi. iOS-da decodeRestorableState metodi, Android-da esa onRestoreInstanceState yoki SavedStateHandle-dan o'qish chaqiriladi. Ilova paketdan identifikatorlar va kalitlarni ajratib oladi va UI-ni tiklaydi: aylantirish pozitsiyasi, tanlangan elementlar, kiritilgan ma'lumotlar.
Shuni hisobga olish kerakki, tiklash yangi jarayonda sodir bo'lishi mumkin. Agar ilova xotiradan butunlay o'chirilgan bo'lsa, jarayon qaytadan yaratiladi va xotiradagi barcha obyektlar mavjud bo'lmaydi. Shuning uchun holat serializatsiya qilinadigan va oldingi sessiyaning ish vaqti kontekstidan mustaqil bo'lishi kerak. Bu, ayniqsa, ko'plab kiritish maydonlari bo'lgan katta formalar va uzun ko'p sahifali interfeyslar uchun juda muhimdir.
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-ni amalga oshirish platformalar o'rtasida sezilarli darajada farqlanadi. iOS storyboard va UIKit protokollari orqali deklarativ yondashuvdan, Android esa Activity hayotiy tsikli metodlari va Jetpack arxitektura komponentlari orqali imperativ yondashuvdan foydalanadi. Yondashuvni tanlash maqsadli platforma va ilova arxitekturasiga bog'liq.
iOS-da State Restoration uchta komponentga asoslanadi: UIApplication umumiy jarayonni boshqaradi, UIViewController UIStateRestoring protokolini amalga oshiradi, NSUserActivity esa navigatsiyani tiklash uchun ma'lumotlarni saqlaydi. Faollashtirish uchun UIViewController-da restorationIdentifier o'rnatish va encodeRestorableState hamda decodeRestorableState metodlarini amalga oshirish kerak.
iOS navigatsiya kontrolleri (UINavigationController) va barcha ichki ViewController-larning holatini avtomatik saqlaydi, agar ularda restorationIdentifier o'rnatilgan bo'lsa. Tizim navigatsiya stekini boshqaradi va uni asl holatida tiklaydi. Biroq kontrollerlar ichidagi ma'lumotlar (kiritilgan matn, aylantirish pozitsiyasi) dasturchi tomonidan aniq saqlanishi kerak.
Android-da State Restoration-ga zamonaviy yondashuv AndroidX Lifecycle kutubxonasidan SavedStateHandle komponentiga asoslanadi. SavedStateHandle ViewModel ichida mavjud va konfiguratsiya o'zgarishi (ekran aylantirish) va jarayonni qayta ishga tushirishda ma'lumotlarni avtomatik saqlaydi va tiklaydi. Ma'lumotlar Bundle-da saqlanadi va avtomatik serializatsiya qilinadi.
SavedStateHandle LiveData qo'llab-quvvatlashi bilan kalit-qiymat saqlash kabi ishlaydi. Konfiguratsiya o'zgarishi vaqtida ma'lumotlar avtomatik saqlanadi va tiklanadi. Jarayonni qayta ishga tushirishni qo'llab-quvvatlash uchun ViewModel SavedStateViewModelFactory orqali yaratilishi kerak — bu ViewModel-ga ilovaning to'liq yopilishidan omon qolish imkonini beradi.
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-ni amaliy amalga oshirish bir necha jihatlarni hisobga olishni talab qiladi: to'g'ri saqlashni tanlash, saqlanadigan ma'lumotlar hajmini aniqlash va turli yopish stsenariylarini sinab ko'rish. Flutter ilovasi uchun state_restoration paketidan foydalanib, bosqichma-bosqich amalga oshirishni ko'rib chiqaylik.
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 ?? '';
}
}
Amalga oshirishda saqlash chegaralarini eslab qolish muhimdir. Har bir UI maydoni tiklashni talab qilmaydi. Uzun ro'yxatda aylantirish pozitsiyasi — ha. Animatsiyaning vaqtinchalik holati — yo'q. Dasturchi qaysi ma'lumotlar foydalanuvchi tajribasi uchun muhimligini, qaysilari esa qulaylikni yo'qotmasdan xavfsiz tiklab olinishini ongli ravishda tanlashi kerak.
State Restoration-ni sinab ko'rish jarayonni yopish simulyatsiyasini talab qiladigan alohida vazifadir. Android-da bu adb shell am kill buyrug'i bilan, iOS-da esa Xcode-da yopish simulyatsiyasi bilan amalga oshirilishi mumkin. Espresso va XCTest kabi UI test freymvorklari holatni tiklashni tekshirish uchun maxsus metodlarni taqdim etadi.
Birinchi qoida — identifikatorlarni saqlang, ma'lumotlarni emas. Yuz maydoni bo'lgan to'liq obyektni saqlash o'rniga, uning noyob identifikatorini saqlang va tiklash vaqtida ma'lumotlar bazasidan yoki API-dan dolzarb ma'lumotlarni yuklang. Bu Bundle-da joyni tejaydi va tiklash vaqtida ma'lumotlarning dolzarbligini ta'minlaydi.
Ikkinchi qoida — barcha stsenariylarni sinab ko'ring. Ekran aylantirilgandan so'ng, kichraytirish va bir soatdan keyin qaytishdan so'ng, xotira yetishmasligi sababli tizim tomonidan ilova yopilgandan so'ng tiklashni tekshiring. Har bir stsenariy operatsion tizim holati va mavjud resurslarga qarab turlicha harakat qilishi mumkin.
Uchinchi qoida — tizim mexanizmlaridan foydalaning, o'zingiznikidan emas. iOS va Android State Restoration uchun tegishli platformaga optimallashtirilgan o'rnatilgan API-larni taqdim etadi. SharedPreferences yoki UserDefaults orqali o'z amalga oshirish sinxronizatsiya muammolariga va tiklash vaqtida kutilmagan xatti-harakatlarga olib kelishi mumkin.
To'rtinchi qoida — holat yo'qligini boshqaring. Birinchi ishga tushirishda yoki ma'lumotlarni tozalashdan so'ng holat mavjud bo'lmasligi mumkin. UI boshlang'ich holatda istisnolarni tashlamasdan to'g'ri ishlashi kerak. Ishlatishdan oldin barcha saqlangan ma'lumotlarni null uchun tekshiring va standart qiymatlarni taqdim eting.
Beshinchi qoida — saqlangan kalitlarni hujjatlashtiring. Loyihada o'nlab ekranlar mavjud bo'lganda va har biri bir nechta maydonlarni saqlaganda, markazlashtirilgan kalit boshqaruvisiz tartibsizlik yuzaga keladi. Har bir modulda State Restoration uchun kalit konstantalari bilan yagona sinf yoki fayl yarating. Bu texnik xizmat ko'rsatishni soddalashtiradi va refaktoring vaqtida ma'lumotlarning tasodifiy qayta yozilishining oldini oladi.
Ko'p beriladigan savollar
State Restoration — ilova qayta ishga tushirilganda yoki kichraytirilgandan so'ng foydalanuvchi interfeysini saqlash va tiklash mexanizmi, foydalanuvchi ma'lumotlari va ish kontekstini yo'qotishning oldini oladi.
State Restoration UI-ning vaqtinchalik holatini (aylantirish pozitsiyasi, formaga kiritilgan ma'lumotlar) saqlaydi, ma'lumotlar bazasi esa doimiy foydalanuvchi ma'lumotlarini saqlaydi. State Restoration hajm cheklovi bilan tizim mexanizmlaridan (Bundle, NSData) foydalanadi.
AndroidX Lifecycle-dan ViewModel-da SavedStateHandle dan foydalaning. U kichraytirish vaqtida ma'lumotlarni avtomatik saqlaydi va qaytishda tiklaydi. To'liq qayta ishga tushirishni qo'llab-quvvatlash uchun SavedStateViewModelFactory dan foydalaning.
UIViewController-da restorationIdentifier o'rnating va encodeRestorableState hamda decodeRestorableState metodlarini amalga oshiring. Navigatsiya uchun kontrollerlar stekida yo'lni saqlash bilan NSUserActivity dan foydalaning.
To'liq ma'lumotlarni emas, identifikatorlarni saqlang: tanlangan elementning ID-si, qidiruv so'rovi, aylantirish pozitsiyasi, kalitlarning holati. Katta obyektlar va tasvirlarni saqlashdan saqlaning.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.