स्टेट रिस्टोरेशन (State Restoration) मोबाइल ऑपरेटिंग सिस्टम का एक तंत्र है जो एप्लिकेशन के पुनरारंभ या छोटा करने के बाद यूज़र इंटरफ़ेस को सेव और रीस्टोर करने की अनुमति देता है। सिस्टम UI स्थिति को मेमोरी या स्थायी स्टोरेज में सेव करता है और पुनः खोलने पर इसे रीस्टोर करता है। Android Developers (2025) के अनुसार, State Restoration उन अनुप्रयोगों के लिए अनिवार्य है जो गुणवत्तापूर्ण उपयोगकर्ता अनुभव चाहते हैं। State Restoration एप्लिकेशन के अप्रत्याशित समाप्ति पर डेटा हानि को रोकने के लिए महत्वपूर्ण है।
मुख्य बिंदु
State Restoration (स्थिति पुनर्स्थापना) एक सिस्टम तंत्र है जो एप्लिकेशन यूज़र इंटरफ़ेस की वर्तमान स्थिति को सेव करने और समाप्ति या पुनरारंभ के बाद इसे पुनर्स्थापित करने की अनुमति देता है। जब उपयोगकर्ता किसी एप्लिकेशन को छोटा करता है या सिस्टम संसाधन मुक्त करने के लिए इसे बंद करता है, State Restoration मुख्य UI मापदंडों को कैप्चर करता है और उन्हें एन्क्रिप्टेड स्टोरेज में सेव करता है।
State Restoration के बिना, उपयोगकर्ता एप्लिकेशन के बीच स्विच करने पर सभी असंग्रहीत डेटा खो देते हैं। उदाहरण के लिए, भरा हुआ फीडबैक फ़ॉर्म, एक लंबा खोज क्वेरी या आंशिक रूप से देखी गई समाचार सूची — यह सब पुनरारंभ पर गायब हो जाता है। State Restoration इस समस्या को छोटा करने के क्षण में ViewController या Activity की स्थिति को स्वचालित रूप से कैप्चर करके हल करता है।
तंत्र सिस्टम स्तर पर काम करता है और दोनों प्रमुख मोबाइल प्लेटफ़ॉर्म द्वारा समर्थित है। iOS NSUserActivity और UIStateRestoring प्रोटोकॉल के माध्यम से State Restoration प्रदान करता है, जबकि Android Jetpack आर्किटेक्चरल घटकों और ViewModel में SavedStateHandle के माध्यम से प्रदान करता है। कार्यान्वयन भिन्न है, लेकिन अवधारणा समान है।
State Restoration प्रक्रिया दो चरणों में विभाजित होती है: सेव और रीस्टोर। सेव चरण में, सिस्टम जीवन चक्र के संबंधित तरीकों को कॉल करता है, जिसमें एप्लिकेशन को वर्तमान UI स्थिति को संक्षिप्त प्रतिनिधित्व में क्रमबद्ध करना होता है। रीस्टोर चरण में, सिस्टम सेव किए गए डेटा को वापस भेजता है, और एप्लिकेशन UI को पुनर्स्थापित करने के लिए इसे डिसीरियलाइज़ करता है।
सेव सिस्टम द्वारा तब शुरू किया जाता है जब एप्लिकेशन बैकग्राउंड में जाता है या आसन्न समाप्ति का संकेत प्राप्त करता है। iOS में, UIViewController की encodeRestorableState विधि कॉल की जाती है; Android में, Activity की onSaveInstanceState या SavedStateHandle के माध्यम से सेव किया जाता है। डेटा को प्रिमिटिव प्रकारों का समर्थन करने वाले प्रारूप में क्रमबद्ध किया जाता है: स्ट्रिंग्स, संख्याएँ, बाइट ऐरे और Parcelable ऑब्जेक्ट।
सेव किए गए डेटा की मात्रा न्यूनतम होनी चाहिए — सिस्टम सेव किए गए स्थिति बंडल के आकार पर सीमाएँ लगाता है। Android में, सीमा प्रति प्रक्रिया लगभग 50 KB है। सीमा से अधिक होने पर TransactionTooLargeException अपवाद होता है। इसलिए, आर्किटेक्ट केवल पहचानकर्ता और कुंजियाँ सेव करने की सलाह देते हैं, और पूर्ण डेटा पुनर्स्थापना पर स्थायी स्टोरेज से लोड करते हैं।
पुनर्स्थापना के दौरान, सिस्टम स्टार्टअप पर सेव किए गए डेटा बंडल को एप्लिकेशन को भेजता है। iOS में, decodeRestorableState विधि कॉल की जाती है; Android में, onRestoreInstanceState या SavedStateHandle से पढ़ा जाता है। एप्लिकेशन बंडल से पहचानकर्ता और कुंजियाँ निकालता है और UI को पुनर्स्थापित करता है: स्क्रॉल स्थिति, चयनित आइटम, दर्ज किया गया डेटा।
यह ध्यान रखना महत्वपूर्ण है कि पुनर्स्थापना एक नई प्रक्रिया में हो सकती है। यदि एप्लिकेशन पूरी तरह से मेमोरी से अनलोड हो गया था, तो प्रक्रिया नए सिरे से बनाई जाती है, और मेमोरी में सभी ऑब्जेक्ट अनुपस्थित होते हैं। इसलिए, स्थिति क्रमबद्ध करने योग्य और पिछले सत्र के रनटाइम संदर्भ से स्वतंत्र होनी चाहिए। यह विशेष रूप से कई इनपुट फ़ील्ड वाले बड़े फ़ॉर्म और लंबे बहु-पृष्ठ इंटरफ़ेस के लिए महत्वपूर्ण है।
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 का कार्यान्वयन प्लेटफ़ॉर्म के बीच काफी भिन्न होता है। iOS स्टोरीबोर्ड और UIKit प्रोटोकॉल के माध्यम से एक घोषणात्मक दृष्टिकोण का उपयोग करता है, जबकि Android Activity जीवन चक्र विधियों और Jetpack आर्किटेक्चरल घटकों के माध्यम से एक अनिवार्य दृष्टिकोण का उपयोग करता है। दृष्टिकोण का चुनाव लक्ष्य प्लेटफ़ॉर्म और एप्लिकेशन आर्किटेक्चर पर निर्भर करता है।
iOS में, State Restoration तीन घटकों पर बनाया गया है: UIApplication समग्र प्रक्रिया का प्रबंधन करता है, UIViewController UIStateRestoring प्रोटोकॉल को लागू करता है, और NSUserActivity नेविगेशन पुनर्स्थापना के लिए डेटा संग्रहीत करता है। इसे सक्षम करने के लिए, UIViewController पर restorationIdentifier सेट करना और encodeRestorableState तथा decodeRestorableState को लागू करना आवश्यक है।
iOS स्वचालित रूप से नेविगेशन कंट्रोलर (UINavigationController) और सभी नेस्टेड ViewControllers की स्थिति को सेव करता है यदि उनके पास restorationIdentifier सेट है। सिस्टम नेविगेशन स्टैक का प्रबंधन करता है और इसे अपनी मूल स्थिति में पुनर्स्थापित करता है। हालांकि, कंट्रोलर के अंदर का डेटा (दर्ज किया गया टेक्स्ट, स्क्रॉल स्थिति) डेवलपर द्वारा स्पष्ट रूप से सेव किया जाना चाहिए।
Android में, State Restoration के लिए आधुनिक दृष्टिकोण SavedStateHandle पर बनाया गया है — AndroidX Lifecycle लाइब्रेरी का एक घटक। SavedStateHandle ViewModel के अंदर सुलभ है और कॉन्फ़िगरेशन परिवर्तन (स्क्रीन रोटेशन) और प्रक्रिया पुनरारंभ पर स्वचालित रूप से डेटा सेव और पुनर्स्थापित करता है। डेटा Bundle में संग्रहीत होता है और स्वचालित रूप से क्रमबद्ध होता है।
SavedStateHandle LiveData समर्थन के साथ कुंजी-मूल्य भंडार की तरह व्यवहार करता है। कॉन्फ़िगरेशन परिवर्तनों पर, डेटा स्वचालित रूप से सेव और पुनर्स्थापित होता है। प्रक्रिया पुनरारंभ का समर्थन करने के लिए, ViewModel को SavedStateViewModelFactory के माध्यम से बनाया जाना चाहिए — यह ViewModel को पूर्ण एप्लिकेशन समाप्ति से बचने की अनुमति देता है।
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 के व्यावहारिक कार्यान्वयन के लिए कई पहलुओं पर विचार करना आवश्यक है: सही स्टोरेज चुनना, सेव किए जाने वाले डेटा की मात्रा निर्धारित करना और विभिन्न समाप्ति परिदृश्यों का परीक्षण करना। आइए Flutter एप्लिकेशन के लिए state_restoration पैकेज का उपयोग करके चरण-दर-चरण कार्यान्वयन देखें।
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 ?? '';
}
}
कार्यान्वयन करते समय, सेव सीमाओं को याद रखना महत्वपूर्ण है। हर UI फ़ील्ड को पुनर्स्थापित करने की आवश्यकता नहीं है। लंबी सूची में स्क्रॉल स्थिति — हाँ। अस्थायी एनिमेशन स्थिति — नहीं। डेवलपर को सचेत रूप से चुनना चाहिए कि कौन सा डेटा उपयोगकर्ता अनुभव के लिए महत्वपूर्ण है और किसे सुविधा की हानि के बिना सुरक्षित रूप से रीसेट किया जा सकता है।
State Restoration का परीक्षण एक अलग कार्य है जिसके लिए प्रक्रिया समाप्ति का अनुकरण आवश्यक है। Android पर, यह adb shell am kill कमांड के माध्यम से किया जा सकता है; iOS पर, Xcode में समाप्ति अनुकरण के माध्यम से। UI परीक्षण फ्रेमवर्क जैसे Espresso और XCTest स्थिति पुनर्स्थापना की जाँच के लिए विशेष विधियाँ प्रदान करते हैं।
पहला नियम — पहचानकर्ता सेव करें, डेटा नहीं। सौ फ़ील्ड वाली पूर्ण ऑब्जेक्ट को सेव करने के बजाय, इसका अद्वितीय पहचानकर्ता सेव करें, और पुनर्स्थापना पर डेटाबेस या API से वास्तविक डेटा लोड करें। यह Bundle में जगह बचाता है और पुनर्स्थापना के समय डेटा की ताजगी सुनिश्चित करता है।
दूसरा नियम — सभी परिदृश्यों का परीक्षण करें। स्क्रीन रोटेशन के बाद, छोटा करने और एक घंटे बाद वापस आने पर, मेमोरी की कमी के कारण सिस्टम द्वारा एप्लिकेशन समाप्त करने के बाद पुनर्स्थापना की जाँच करें। प्रत्येक परिदृश्य ऑपरेटिंग सिस्टम की स्थिति और उपलब्ध संसाधनों के आधार पर अलग-अलग व्यवहार कर सकता है।
तीसरा नियम — सिस्टम तंत्र का उपयोग करें, कस्टम नहीं। iOS और Android State Restoration के लिए अंतर्निहित API प्रदान करते हैं जो उनके विशिष्ट प्लेटफ़ॉर्म के लिए अनुकूलित हैं। SharedPreferences या UserDefaults के माध्यम से कस्टम कार्यान्वयन सिंक्रोनाइज़ेशन समस्याओं और पुनर्स्थापना के दौरान अप्रत्याशित व्यवहार का कारण बन सकता है।
चौथा नियम — स्थिति की अनुपस्थिति को संभालें। पहले लॉन्च पर या डेटा साफ़ करने के बाद, स्थिति अनुपस्थित हो सकती है। UI को अपवाद फेंके बिना अपनी प्रारंभिक स्थिति में सही ढंग से काम करना चाहिए। उपयोग से पहले सभी सेव किए गए डेटा को null के लिए जाँचें और डिफ़ॉल्ट मान प्रदान करें।
पाँचवाँ नियम — सेव की गई कुंजियों का दस्तावेज़ीकरण करें। जब किसी प्रोजेक्ट में दर्जनों स्क्रीन हों और प्रत्येक कई फ़ील्ड सेव करता हो, तो केंद्रीकृत कुंजी प्रबंधन के बिना अराजकता उत्पन्न होती है। प्रत्येक मॉड्यूल में State Restoration के लिए कुंजी स्थिरांक वाली एक एकल क्लास या फ़ाइल बनाएँ। यह रखरखाव को सरल बनाता है और रीफ़ैक्टरिंग के दौरान आकस्मिक डेटा ओवरराइट को रोकता है।
अक्सर पूछे जाने वाले प्रश्न
State Restoration एक तंत्र है जो एप्लिकेशन के पुनरारंभ या छोटा करने के बाद यूज़र इंटरफ़ेस को सेव और पुनर्स्थापित करता है, डेटा और उपयोगकर्ता संदर्भ की हानि को रोकता है।
State Restoration अस्थायी UI स्थिति (स्क्रॉल स्थिति, फ़ॉर्म में दर्ज डेटा) सेव करता है, जबकि डेटाबेस स्थायी उपयोगकर्ता डेटा संग्रहीत करता है। State Restoration मात्रा सीमाओं के साथ सिस्टम तंत्र (Bundle, NSData) का उपयोग करता है।
AndroidX Lifecycle से ViewModel में SavedStateHandle का उपयोग करें। यह छोटा करने पर स्वचालित रूप से डेटा सेव करता है और वापस आने पर पुनर्स्थापित करता है। पूर्ण पुनरारंभ समर्थन के लिए SavedStateViewModelFactory का उपयोग करें।
UIViewController पर restorationIdentifier सेट करें और encodeRestorableState तथा decodeRestorableState विधियों को लागू करें। नेविगेशन के लिए, कंट्रोलर स्टैक में पथ संरक्षण के साथ NSUserActivity का उपयोग करें।
पहचानकर्ता सेव करें, पूर्ण डेटा नहीं: चयनित आइटम का ID, खोज क्वेरी, स्क्रॉल स्थिति, टॉगल स्थितियाँ। बड़ी ऑब्जेक्ट और इमेज को सेव करने से बचें।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें