স্টেট রিস্টোরেশন (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 অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন