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) اور تمام نیسٹڈ ViewController کی حالت کو محفوظ کرتا ہے اگر ان کے پاس 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 ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں