State Restoration ในแอปพลิเคชันมือถือ: คืออะไร กลไก และหลักการทำงาน

ผู้แต่ง: IT Sectr เผยแพร่เมื่อ: 2026-05-18 เวลาอ่าน: 8 นาที

State Restoration เป็นกลไกของระบบปฏิบัติการมือถือที่ช่วยให้สามารถบันทึกและกู้คืนอินเทอร์เฟซผู้ใช้ของแอปพลิเคชันหลังจากรีสตาร์ทหรือย่อขนาดลง ระบบจะบันทึกสถานะ UI ลงในหน่วยความจำหรือพื้นที่จัดเก็บถาวรและกู้คืนเมื่อเปิดอีกครั้ง ตามข้อมูลจาก Android Developers (2025) State Restoration เป็นสิ่งจำเป็นสำหรับแอปพลิเคชันที่มุ่งหวังประสบการณ์ผู้ใช้ที่มีคุณภาพ State Restoration มีความสำคัญอย่างยิ่งในการป้องกันการสูญเสียข้อมูลเมื่อแอปพลิเคชันสิ้นสุดโดยไม่คาดคิด

ประเด็นสำคัญ

  • State Restoration — กลไกการบันทึกและกู้คืน UI เมื่อรีสตาร์ทแอปพลิเคชัน ป้องกันการสูญเสียข้อมูลและบริบทของผู้ใช้
  • วงจรชีวิต — การกู้คืนจะทำงานเมื่อเริ่มใหม่หลังจากย่อขนาด รีบูตอุปกรณ์ หรือระบบปิดแอปพลิเคชัน
  • แพลตฟอร์ม — iOS รองรับ State Restoration ผ่าน UIKit (NSUserActivity, UIStateRestoring), Android ผ่าน SavedStateHandle และ ViewModel
  • ข้อมูลที่ต้องบันทึก — ตำแหน่งเลื่อน ข้อมูลที่ป้อนในแบบฟอร์ม สถานะการนำทาง เนื้อหามัลติมีเดีย และรายการที่เลือก
  • การดำเนินการ — ต้องทำให้สถานะเป็นอนุกรมใน Bundle หรือ NSData และกู้คืนในเมธอดวงจรชีวิตที่เกี่ยวข้อง

State Restoration คืออะไร

State Restoration (การกู้คืนสถานะ) เป็นกลไกระบบที่ช่วยให้สามารถบันทึกสถานะปัจจุบันของอินเทอร์เฟซผู้ใช้ของแอปพลิเคชันและกู้คืนหลังจากสิ้นสุดหรือรีสตาร์ท เมื่อผู้ใช้ย่อขนาดแอปพลิเคชันหรือระบบปิดแอปเพื่อเพิ่มทรัพยากร State Restoration จะบันทึกพารามิเตอร์ UI ที่สำคัญและจัดเก็บไว้ในพื้นที่จัดเก็บที่เข้ารหัส

หากไม่มี State Restoration ผู้ใช้จะสูญเสียข้อมูลที่ยังไม่ได้บันทึกทั้งหมดเมื่อสลับระหว่างแอปพลิเคชัน ตัวอย่างเช่น แบบฟอร์มข้อเสนอแนะที่กรอกแล้ว คำค้นหายาว หรือรายการข่าวที่ดูบางส่วน — ทั้งหมดนี้จะหายไปเมื่อรีสตาร์ท State Restoration แก้ปัญหานี้โดยการบันทึกสถานะของ ViewController หรือ Activity โดยอัตโนมัติในขณะที่ย่อขนาด

กลไกทำงานในระดับระบบและรองรับโดยแพลตฟอร์มมือถือหลักทั้งสอง iOS ให้บริการ State Restoration ผ่าน NSUserActivity และโปรโตคอล UIStateRestoring ในขณะที่ Android ให้บริการผ่าน SavedStateHandle ในส่วนประกอบสถาปัตยกรรม Jetpack และ ViewModel การดำเนินการแตกต่างกัน แต่แนวคิดเหมือนกัน

State Restoration ทำงานอย่างไร

กระบวนการ State Restoration แบ่งออกเป็นสองระยะ: การบันทึกและการกู้คืน ในระยะการบันทึก ระบบจะเรียกเมธอดวงจรชีวิตที่เกี่ยวข้อง ซึ่งแอปพลิเคชันต้องทำให้สถานะ UI ปัจจุบันเป็นอนุกรมในรูปแบบ การแสดงผลแบบกะทัดรัด ในระยะการกู้คืน ระบบจะส่งข้อมูลที่บันทึกไว้กลับมา และแอปพลิเคชันจะทำการดีซีเรียลไลซ์เพื่อกู้คืน UI

กลไกการบันทึกสถานะ

การบันทึกเริ่มต้นโดยระบบเมื่อแอปพลิเคชันเข้าสู่พื้นหลังหรือได้รับสัญญาณการสิ้นสุดที่ใกล้จะถึง ใน iOS จะเรียกเมธอด encodeRestorableState ของ UIViewController ใน Android จะเรียก onSaveInstanceState ของ Activity หรือการบันทึกผ่าน SavedStateHandle ข้อมูลถูกทำให้เป็นอนุกรมในรูปแบบที่รองรับชนิดข้อมูลพื้นฐาน: สตริง ตัวเลข อาร์เรย์ไบต์ และออบเจ็กต์ Parcelable

ปริมาณข้อมูลที่บันทึกควรน้อยที่สุด — ระบบกำหนดข้อจำกัดเกี่ยวกับขนาดของ ชุดสถานะที่บันทึก ใน Android ขีดจำกัดอยู่ที่ประมาณ 50 KB ต่อกระบวนการ การเกินขีดจำกัดจะทำให้เกิดข้อยกเว้น TransactionTooLargeException ดังนั้น สถาปนิกแนะนำให้บันทึกเฉพาะตัวระบุและคีย์ และโหลดข้อมูลทั้งหมดจากพื้นที่จัดเก็บถาวรเมื่อกู้คืน

การกู้คืน UI จากสถานะที่บันทึกไว้

ในระหว่างการกู้คืน ระบบจะส่งชุดข้อมูลที่บันทึกไว้ไปยังแอปพลิเคชันในขณะเริ่มทำงาน ใน iOS จะเรียกเมธอด decodeRestorableState ใน Android จะใช้ onRestoreInstanceState หรือการอ่านจาก SavedStateHandle แอปพลิเคชันจะดึงตัวระบุและคีย์จากชุดข้อมูลและกู้คืน UI: ตำแหน่งเลื่อน รายการที่เลือก ข้อมูลที่ป้อน

สิ่งสำคัญที่ต้องทราบคือการกู้คืนอาจเกิดขึ้น ในกระบวนการใหม่ หากแอปพลิเคชันถูกนำออกจากหน่วยความจำทั้งหมด กระบวนการจะถูกสร้างขึ้นใหม่ และออบเจ็กต์ทั้งหมดในหน่วยความจำจะหายไป ดังนั้น สถานะต้องสามารถทำให้เป็นอนุกรมได้และเป็นอิสระจากบริบทรันไทม์ของเซสชันก่อนหน้า สิ่งนี้สำคัญอย่างยิ่งสำหรับแบบฟอร์มขนาดใหญ่ที่มีหลายฟิลด์ป้อนข้อมูลและอินเทอร์เฟซหลายหน้ายาว

kotlin
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 และ Android

การดำเนินการ State Restoration แตกต่างกันอย่างมีนัยสำคัญระหว่างแพลตฟอร์ม iOS ใช้แนวทางแบบประกาศผ่าน storyboard และโปรโตคอล UIKit ในขณะที่ Android ใช้แนวทางแบบจำเป็นผ่านเมธอดวงจรชีวิตของ Activity และส่วนประกอบสถาปัตยกรรม Jetpack การเลือกแนวทางขึ้นอยู่กับแพลตฟอร์มเป้าหมายและสถาปัตยกรรมของแอปพลิเคชัน

State Restoration ใน iOS (UIKit)

ใน iOS State Restoration สร้างขึ้นจากสามส่วนประกอบ: UIApplication จัดการกระบวนการโดยรวม UIViewController ใช้โปรโตคอล UIStateRestoring และ NSUserActivity จัดเก็บข้อมูลสำหรับการกู้คืนการนำทาง หากต้องการเปิดใช้งาน ต้องตั้งค่า restorationIdentifier บน UIViewController และดำเนินการ encodeRestorableState และ decodeRestorableState

iOS จะบันทึกสถานะของตัวควบคุมการนำทาง (UINavigationController) และ ViewController ที่ซ้อนกันทั้งหมดโดยอัตโนมัติหากมี restorationIdentifier ตั้งไว้ ระบบจัดการสแต็กการนำทางและกู้คืนให้อยู่ในสถานะดั้งเดิม อย่างไรก็ตาม ข้อมูลภายในตัวควบคุม (ข้อความที่ป้อน ตำแหน่งเลื่อน) ต้องถูกบันทึกอย่างชัดเจนโดยนักพัฒนา

State Restoration ใน Android (SavedStateHandle)

ใน Android แนวทางสมัยใหม่สำหรับ State Restoration สร้างขึ้นบน SavedStateHandle — ส่วนประกอบจากไลบรารี AndroidX Lifecycle SavedStateHandle สามารถเข้าถึงได้ภายใน ViewModel และบันทึกและกู้คืนข้อมูลโดยอัตโนมัติเมื่อมีการเปลี่ยนแปลงการกำหนดค่า (หมุนหน้าจอ) และรีสตาร์ทกระบวนการ ข้อมูลถูกจัดเก็บใน Bundle และทำให้เป็นอนุกรมโดยอัตโนมัติ

SavedStateHandle ทำหน้าที่เป็น พื้นที่จัดเก็บคีย์-ค่า ที่รองรับ LiveData เมื่อมีการเปลี่ยนแปลงการกำหนดค่า ข้อมูลจะถูกบันทึกและกู้คืนโดยอัตโนมัติ เพื่อรองรับการรีสตาร์ทกระบวนการ ต้องสร้าง ViewModel ผ่าน SavedStateViewModelFactory — ซึ่งช่วยให้ ViewModel อยู่รอดหลังจากการสิ้นสุดแอปพลิเคชันโดยสมบูรณ์

kotlin
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 ในโค้ด

การดำเนินการ State Restoration ในทางปฏิบัติจำเป็นต้องพิจารณาหลายด้าน: การเลือกพื้นที่จัดเก็บที่เหมาะสม การกำหนดปริมาณข้อมูลที่จะบันทึก และการทดสอบสถานการณ์การสิ้นสุดต่างๆ มาดูการดำเนินการทีละขั้นตอนสำหรับ แอปพลิเคชัน Flutter โดยใช้แพ็คเกจ state_restoration

dart
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 มีเมธอดพิเศษสำหรับตรวจสอบการกู้คืนสถานะ

แนวทางปฏิบัติที่ดีที่สุดสำหรับ State Restoration

กฎข้อแรก — บันทึก ตัวระบุ ไม่ใช่ข้อมูล แทนที่จะบันทึกออบเจ็กต์ทั้งหมดที่มีร้อยฟิลด์ ให้บันทึกตัวระบุที่ไม่ซ้ำกัน และเมื่อกู้คืนให้โหลดข้อมูลจริงจากฐานข้อมูลหรือ API ซึ่งช่วยประหยัดพื้นที่ใน Bundle และรับประกันความสดใหม่ของข้อมูลในขณะที่กู้คืน

กฎข้อที่สอง — ทดสอบทุกสถานการณ์ ตรวจสอบการกู้คืนหลังจากการหมุนหน้าจอ หลังจากย่อขนาดและกลับมาหนึ่งชั่วโมงต่อมา หลังจากระบบสิ้นสุดแอปเนื่องจากหน่วยความจำไม่เพียงพอ แต่ละสถานการณ์อาจทำงานแตกต่างกันขึ้นอยู่กับสถานะของระบบปฏิบัติการและทรัพยากรที่มีอยู่

กฎข้อที่สาม — ใช้ กลไกระบบ ไม่ใช่กลไกที่กำหนดเอง iOS และ Android มี API ในตัวสำหรับ State Restoration ที่ปรับให้เหมาะสมสำหรับแพลตฟอร์มเฉพาะของตน การดำเนินการแบบกำหนดเองผ่าน SharedPreferences หรือ UserDefaults อาจทำให้เกิดปัญหาการซิงโครไนซ์และพฤติกรรมที่ไม่คาดคิดในระหว่างการกู้คืน

กฎข้อที่สี่ — จัดการกรณีที่ไม่มีสถานะ ในการเปิดใช้ครั้งแรกหรือหลังจากล้างข้อมูล สถานะอาจไม่มีอยู่ UI ต้องทำงานอย่างถูกต้องในสถานะเริ่มต้นโดยไม่เกิดข้อยกเว้น ตรวจสอบข้อมูลที่บันทึกทั้งหมดว่าเป็น null ก่อนใช้งานและกำหนดค่าเริ่มต้น

กฎข้อที่ห้า — บันทึกคีย์ที่จัดเก็บ เมื่อโปรเจกต์มีหน้าจอหลายสิบหน้าและแต่ละหน้าบันทึกหลายฟิลด์ หากไม่มีการจัดการคีย์แบบรวมศูนย์จะเกิดความสับสนวุ่นวาย สร้างคลาสหรือไฟล์เดียวที่มีค่าคงที่ของคีย์สำหรับ State Restoration ในแต่ละโมดูล ซึ่งช่วยลดความซับซ้อนในการบำรุงรักษาและป้องกันการเขียนทับข้อมูลโดยไม่ได้ตั้งใจเมื่อปรับโครงสร้าง

คำถามที่พบบ่อย

State Restoration ในแอปพลิเคชันมือถือคืออะไร

State Restoration เป็นกลไกในการบันทึกและกู้คืนอินเทอร์เฟซผู้ใช้ของแอปพลิเคชันหลังจากรีสตาร์ทหรือย่อขนาด ป้องกันการสูญเสียข้อมูลและบริบทของผู้ใช้

State Restoration แตกต่างจากการบันทึกในฐานข้อมูลอย่างไร

State Restoration บันทึก สถานะ UI ชั่วคราว (ตำแหน่งเลื่อน ข้อมูลในแบบฟอร์ม) ในขณะที่ฐานข้อมูลจัดเก็บข้อมูลผู้ใช้ถาวร State Restoration ใช้กลไกระบบ (Bundle, NSData) พร้อมข้อจำกัดด้านปริมาณ

วิธีดำเนินการ State Restoration ใน Android

ใช้ SavedStateHandle ใน ViewModel จาก AndroidX Lifecycle โดยจะบันทึกข้อมูลโดยอัตโนมัติเมื่อย่อขนาดและกู้คืนเมื่อกลับมา สำหรับการรองรับการรีสตาร์ทเต็มรูปแบบ ให้ใช้ SavedStateViewModelFactory

วิธีดำเนินการ State Restoration ใน iOS

ตั้งค่า restorationIdentifier บน UIViewController และดำเนินการเมธอด encodeRestorableState และ decodeRestorableState สำหรับการนำทาง ให้ใช้ NSUserActivity พร้อมการรักษาเส้นทางในสแต็กตัวควบคุม

ควรบันทึกข้อมูลใดในระหว่าง State Restoration

บันทึก ตัวระบุ ไม่ใช่ข้อมูลทั้งหมด: ID ของรายการที่เลือก คำค้นหา ตำแหน่งเลื่อน สถานะสวิตช์ หลีกเลี่ยงการบันทึกออบเจ็กต์ขนาดใหญ่และรูปภาพ

สรุป

  • State Restoration — กลไกระบบสำหรับบันทึกและกู้คืน UI เมื่อรีสตาร์ทแอปพลิเคชัน สำคัญต่อประสบการณ์ผู้ใช้
  • iOS — ใช้โปรโตคอล UIStateRestoring และ NSUserActivity เพื่อบันทึกการนำทางและข้อมูลตัวควบคุม
  • Android — มี SavedStateHandle ใน ViewModel สำหรับการบันทึกและกู้คืนสถานะอัตโนมัติ
  • Flutter — รองรับ RestorableProperty และ RestorableStatefulWidget สำหรับบันทึกสถานะวิดเจ็ต
  • ข้อจำกัด — ขนาดข้อมูลที่บันทึกถูกจำกัด (~50 KB บน Android) ควรบันทึกเฉพาะตัวระบุ
  • การทดสอบ — จำเป็นต้องตรวจสอบทุกสถานการณ์: หมุนหน้าจอ ย่อขนาด การสิ้นสุดกระบวนการโดยระบบ
  • กลยุทธ์ — ใช้ API ของระบบแทนการดำเนินการแบบกำหนดเองผ่านไฟล์หรือ SharedPreferences

เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร

IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ

ปรึกษาโครงการ

อ่านเพิ่มเติม