Android State Changes - Introduction

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

ดังนั้นนอกจากจะต้องจัดการกับการทำงานในระหว่างที่แอปทำงานให้ตรงกับที่ต้องการแล้ว ก็จะต้องคำนึงถึงการทำงานของ State Changes ที่อาจจะส่งผลต่อการทำงานของแอปด้วย

บทความนี้จะเป็นจุดเริ่มต้นของเรื่อง State Changes สำหรับผู้เริ่มต้นเท่านั้น ในกรณีที่นักพัฒนาคุ้นเคยกับพื้นฐานมาประมาณหนึ่ง สามารถข้ามไปอ่านบทความอื่นที่เกี่ยวข้องกับเรื่องนี้ได้เลย

บทความในชุดเดียวกัน

State Changes บนแอนดรอยด์จะแบ่งเป็น 2 แบบ

โดยแยกตามเงื่อนไข, รูปแบบในการทำงาน, และผลกระทบที่เกิดขึ้นกับแอปของนักพัฒนา จึงทำให้ State Changes บนแอนดรอยด์มีอยู่ 2 แบบด้วยกัน

  • Configuration Changes
  • Process Recreation

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

ความแตกต่างระหว่าง Configuration Changes กับ Process Recreation

เกิดขึ้นเมื่อไร

  • Configuration Changes – เกิดขึ้นในระหว่างที่ใช้งานแอปแล้วสถานะของอุปกรณ์แอนดรอยด์มีการเปลี่ยนแปลง เช่น หมุนหน้าจอ, เปลี่ยนภาษา, หรือสลับหน้าจอบน Foldable Device เป็นต้น
  • Process Recreation – เกิดขึ้นในระหว่างที่แอปไม่ได้ใช้งานหรือถูกย่อเก็บไว้ในเบื้องหลัง แล้วเกิดปัญหาว่า Memory ที่เหลืออยู่ในเครื่องไม่เพียงพอต่อการใช้งาน ณ ตอนนั้น ทำให้ระบบแอนดรอยด์ต้องปิดแอปที่อยู่ในเบื้องหลังเพื่อคืน Memory ให้กับระบบ

สิ่งที่เกิดขึ้นกับแอป

  • Configuration Changes – ระบบแอนดรอยด์จะทำลาย Activity ที่ Active อยู่และสร้างขึ้นมาใหม่ (Activity Recreation) เพื่อทำให้ Activity นั้นได้รับสถานะล่าสุดของอุปกรณ์แอนดรอยด์พร้อมกับคืนค่าบางอย่างเพื่อทำให้แอปทำงานต่อจากเดิม
  • Process Recreation – ระบบแอนดรอยด์จะทำลาย Process ของแอปทิ้ง และเมื่อผู้ใช้เปิดแอปขึ้นมาใหม่อีกครั้งก็จะสร้าง Process ขึ้นมาใหม่พร้อมกับคืนค่าบางอย่างเพื่อทำให้แอปทำงานต่อจากเดิม

ผลกระทบต่อข้อมูลภายในแอป

  • Configuration Changes – ข้อมูลที่เก็บไว้ใน Activity จะหายไป รวมไปถึง View, Fragment, และ Compose ที่อยู่บน Activity ตัวนั้นด้วย แต่ข้อมูลที่เก็บไว้ใน ViewModel หรือ Singleton ใด ๆ จะยังคงอยู่
  • Process Recreation – ข้อมูลที่เก็บไว้ใน Heap ของแอปจะหายไปทั้งหมด จึงส่งผลต่อข้อมูลที่เก็บไว้ใน Activity, Fragment, View, ViewModel, Compose, และ Singleton ใด ๆ ทั้งหมด

สิ่งที่นักพัฒนาควรทำ

ถึงแม้ว่าระบบปฏิบัติการณ์แอนดรอยด์จะออกแบบการทำงานของ Configuraion Changes และ Process Recreation แตกต่างกัน แต่สิ่งที่เหมือนกันก็คือนักพัฒนาจะต้องจัดการกับข้อมูลที่เป็น State ภายในแอปโดยใช้วิธีเดียวกัน หรือที่เรียกกันว่า State Handling โดยขึ้นอยู่กับว่าข้อมูลดังกล่าวเก็บไว้ที่ใด เช่น Activity, Fragment, View, ViewModel, หรือ Compose เพราะแต่ละ Component จะมีวิธีจัดการกับข้อมูลแตกต่างกันออกไป

โดยเนื้อหาของ State Handling ใน Component แต่ละตัวจะขอเขียนเป็นบทความแยกแต่ละ Component ไป

และ State Changes จะไม่มีผลกับข้อมูลที่เก็บไว้ใน Persistence Storage ดังนั้นจึงไม่ต้องทำอะไรกับข้อมูลที่เก็บไว้ใน Key-value Preference หรือ Database

ความเข้าใจผิดเกี่ยวกับ State Handling

นักพัฒนาบางส่วนอาจจะเข้าใจว่า ตราบใดที่เก็บข้อมูลไว้ใน ViewModel ก็ไม่ต้องทำ State Handling แล้ว เพราะข้อมูลที่อยู่ใน ViewModel จะไม่มีทางหายเหมือนกับใน Activity, Fragment, หรือ View

แต่ในความเป็นจริงการเก็บข้อมูลไว้ใน ViewModel โดยไม่ทำ State Handling ให้ถูกต้อง ก็จะประสบปัญหาว่าข้อมูลหายตอน Process Recreation อยู่ดี

สำหรับ Component ที่ออกแบบให้โหลดข้อมูลใหม่ทุกครั้ง (เช่น รับข้อมูลจากฝั่ง Web Service เป็นต้น) ไม่ต้องทำ State Handling ก็ได้ แต่ก็ต้องมั่นใจว่าในการทำงานของ Component นั้น ๆ ไม่ได้มีข้อมูลที่เป็น State เกิดขึ้นในระหว่างการใช้งานแอป เช่น ข้อมูลที่กรอกลงใน Form และเก็บไว้ใน ViewModel แต่ยังไม่ถูกส่งไปเก็บไว้ที่ Web Service หรือเก็บลง Persistence Storage ก็จะมีโอกาสหายตอน Process Recreation ได้

สรุป

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

ดังนั้นการจัดการกับการทำงานภายในแอปให้รองรับ State Changes บนแอนดรอยด์จึงเป็นเรื่องพื้นฐานที่นักพัฒนาไม่ควรมองข้าม เพื่อให้แอปทำงานต่อจากเดิมได้อย่างราบรื่น