State Restoration เป็นกลไกของระบบปฏิบัติการมือถือที่ช่วยให้สามารถบันทึกและกู้คืนอินเทอร์เฟซผู้ใช้ของแอปพลิเคชันหลังจากรีสตาร์ทหรือย่อขนาดลง ระบบจะบันทึกสถานะ UI ลงในหน่วยความจำหรือพื้นที่จัดเก็บถาวรและกู้คืนเมื่อเปิดอีกครั้ง ตามข้อมูลจาก Android Developers (2025) State Restoration เป็นสิ่งจำเป็นสำหรับแอปพลิเคชันที่มุ่งหวังประสบการณ์ผู้ใช้ที่มีคุณภาพ State Restoration มีความสำคัญอย่างยิ่งในการป้องกันการสูญเสียข้อมูลเมื่อแอปพลิเคชันสิ้นสุดโดยไม่คาดคิด
ประเด็นสำคัญ
State Restoration (การกู้คืนสถานะ) เป็นกลไกระบบที่ช่วยให้สามารถบันทึกสถานะปัจจุบันของอินเทอร์เฟซผู้ใช้ของแอปพลิเคชันและกู้คืนหลังจากสิ้นสุดหรือรีสตาร์ท เมื่อผู้ใช้ย่อขนาดแอปพลิเคชันหรือระบบปิดแอปเพื่อเพิ่มทรัพยากร State Restoration จะบันทึกพารามิเตอร์ UI ที่สำคัญและจัดเก็บไว้ในพื้นที่จัดเก็บที่เข้ารหัส
หากไม่มี State Restoration ผู้ใช้จะสูญเสียข้อมูลที่ยังไม่ได้บันทึกทั้งหมดเมื่อสลับระหว่างแอปพลิเคชัน ตัวอย่างเช่น แบบฟอร์มข้อเสนอแนะที่กรอกแล้ว คำค้นหายาว หรือรายการข่าวที่ดูบางส่วน — ทั้งหมดนี้จะหายไปเมื่อรีสตาร์ท State Restoration แก้ปัญหานี้โดยการบันทึกสถานะของ ViewController หรือ Activity โดยอัตโนมัติในขณะที่ย่อขนาด
กลไกทำงานในระดับระบบและรองรับโดยแพลตฟอร์มมือถือหลักทั้งสอง iOS ให้บริการ State Restoration ผ่าน NSUserActivity และโปรโตคอล UIStateRestoring ในขณะที่ Android ให้บริการผ่าน SavedStateHandle ในส่วนประกอบสถาปัตยกรรม Jetpack และ ViewModel การดำเนินการแตกต่างกัน แต่แนวคิดเหมือนกัน
กระบวนการ State Restoration แบ่งออกเป็นสองระยะ: การบันทึกและการกู้คืน ในระยะการบันทึก ระบบจะเรียกเมธอดวงจรชีวิตที่เกี่ยวข้อง ซึ่งแอปพลิเคชันต้องทำให้สถานะ UI ปัจจุบันเป็นอนุกรมในรูปแบบ การแสดงผลแบบกะทัดรัด ในระยะการกู้คืน ระบบจะส่งข้อมูลที่บันทึกไว้กลับมา และแอปพลิเคชันจะทำการดีซีเรียลไลซ์เพื่อกู้คืน UI
การบันทึกเริ่มต้นโดยระบบเมื่อแอปพลิเคชันเข้าสู่พื้นหลังหรือได้รับสัญญาณการสิ้นสุดที่ใกล้จะถึง ใน iOS จะเรียกเมธอด encodeRestorableState ของ UIViewController ใน Android จะเรียก onSaveInstanceState ของ Activity หรือการบันทึกผ่าน 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 ใช้แนวทางแบบประกาศผ่าน storyboard และโปรโตคอล UIKit ในขณะที่ Android ใช้แนวทางแบบจำเป็นผ่านเมธอดวงจรชีวิตของ Activity และส่วนประกอบสถาปัตยกรรม Jetpack การเลือกแนวทางขึ้นอยู่กับแพลตฟอร์มเป้าหมายและสถาปัตยกรรมของแอปพลิเคชัน
ใน iOS State Restoration สร้างขึ้นจากสามส่วนประกอบ: UIApplication จัดการกระบวนการโดยรวม UIViewController ใช้โปรโตคอล UIStateRestoring และ NSUserActivity จัดเก็บข้อมูลสำหรับการกู้คืนการนำทาง หากต้องการเปิดใช้งาน ต้องตั้งค่า restorationIdentifier บน UIViewController และดำเนินการ 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 มี API ในตัวสำหรับ State Restoration ที่ปรับให้เหมาะสมสำหรับแพลตฟอร์มเฉพาะของตน การดำเนินการแบบกำหนดเองผ่าน SharedPreferences หรือ UserDefaults อาจทำให้เกิดปัญหาการซิงโครไนซ์และพฤติกรรมที่ไม่คาดคิดในระหว่างการกู้คืน
กฎข้อที่สี่ — จัดการกรณีที่ไม่มีสถานะ ในการเปิดใช้ครั้งแรกหรือหลังจากล้างข้อมูล สถานะอาจไม่มีอยู่ UI ต้องทำงานอย่างถูกต้องในสถานะเริ่มต้นโดยไม่เกิดข้อยกเว้น ตรวจสอบข้อมูลที่บันทึกทั้งหมดว่าเป็น null ก่อนใช้งานและกำหนดค่าเริ่มต้น
กฎข้อที่ห้า — บันทึกคีย์ที่จัดเก็บ เมื่อโปรเจกต์มีหน้าจอหลายสิบหน้าและแต่ละหน้าบันทึกหลายฟิลด์ หากไม่มีการจัดการคีย์แบบรวมศูนย์จะเกิดความสับสนวุ่นวาย สร้างคลาสหรือไฟล์เดียวที่มีค่าคงที่ของคีย์สำหรับ State Restoration ในแต่ละโมดูล ซึ่งช่วยลดความซับซ้อนในการบำรุงรักษาและป้องกันการเขียนทับข้อมูลโดยไม่ได้ตั้งใจเมื่อปรับโครงสร้าง
คำถามที่พบบ่อย
State Restoration เป็นกลไกในการบันทึกและกู้คืนอินเทอร์เฟซผู้ใช้ของแอปพลิเคชันหลังจากรีสตาร์ทหรือย่อขนาด ป้องกันการสูญเสียข้อมูลและบริบทของผู้ใช้
State Restoration บันทึก สถานะ UI ชั่วคราว (ตำแหน่งเลื่อน ข้อมูลในแบบฟอร์ม) ในขณะที่ฐานข้อมูลจัดเก็บข้อมูลผู้ใช้ถาวร State Restoration ใช้กลไกระบบ (Bundle, NSData) พร้อมข้อจำกัดด้านปริมาณ
ใช้ SavedStateHandle ใน ViewModel จาก AndroidX Lifecycle โดยจะบันทึกข้อมูลโดยอัตโนมัติเมื่อย่อขนาดและกู้คืนเมื่อกลับมา สำหรับการรองรับการรีสตาร์ทเต็มรูปแบบ ให้ใช้ SavedStateViewModelFactory
ตั้งค่า restorationIdentifier บน UIViewController และดำเนินการเมธอด encodeRestorableState และ decodeRestorableState สำหรับการนำทาง ให้ใช้ NSUserActivity พร้อมการรักษาเส้นทางในสแต็กตัวควบคุม
บันทึก ตัวระบุ ไม่ใช่ข้อมูลทั้งหมด: ID ของรายการที่เลือก คำค้นหา ตำแหน่งเลื่อน สถานะสวิตช์ หลีกเลี่ยงการบันทึกออบเจ็กต์ขนาดใหญ่และรูปภาพ
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม